java 反射机制、代理

来源:互联网 发布:网络连接忘记账号密码 编辑:程序博客网 时间:2024/05/21 13:03

概述、

java反射机制是在运行状态中,可以拿到一个类一个对象,然后拿到所有的类中所有属性和方法。

查看类信息

获取class对象:

1.使用Class类的forName(String clazzName)方法。参数为完整类名。
2.调用某个类的class属性。
3.调用某个对象的getClass()方法。

//第一种方式Class myClass=Class.forName("com.xxx.TestClass");//第二中方式Class  myClass=TestClass.class;//第三种方式TestClass test=new TestClass();Class myClass=test.getClass();

获取class对象的属性、方法

加Declared修饰表示所有,未加表示public;私有属性需要设置取消访问检查,调用setAccessible(boolean)。
所有成员属性:getDeclaredFields()或者getFields(),返回结果Field[]
单个成员属性:getDeclaredField()或者getField(),返回Field
所有方法:getDeclaredMethods()或者getMethods(),返回Method[]
单个方法:getMethod(),返回Method
所有构造:getDeclaredConstructors()或者getConstructors(),返回Constructor

//获取class对象的所有属性 数组Field[] allFields = myClass.getDeclaredFields();//获取class对象的public属性 数组Field[] publicFields = myClass.getFields();//获取class指定属性 如:年龄 Field ageField = myClass.getDeclaredField("age");//获取class指定的public属性Field desField = myClass.getField("des");

2.获取对象的方法

//获取class对象的所有声明方法Method[] methods = myClass.getDeclaredMethods();//获取class对象的所有public方法 Method[] allMethods = myClass.getMethods();//返回次Class对象对应类的、带指定形参列表的public方法(setInfo:方法名,String.class,int.class...形参列表)Method method = myClass.getMethod("setInfo", String.class,int.class);//返回次Class对象对应类的、带指定形参列表的方法Method declaredMethod = myClass.getDeclaredMethod("setAge",int.class);

3.获取构造函数

//获取class对象的所有声明构造函数Constructor<?>[] allConstructors = myClass.;//获取class对象public构造函数Constructor<?>[] publicConstructors = myClass.getConstructors();//获取指定声明构造函数Constructor<?> constructor = myClass.getDeclaredConstructor(String.class);//获取指定声明的public构造函数Constructor publicConstructor = myClass.getConstructor(String.class);

操作对象

生成类的实例对象

1.,Class对象的newInstance()
2.Constructor对象的newInstance()方法

//第一种方式 Class对象调用newInstance()方法生成Object obj = class1.newInstance();//第二种方式 对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//获取指定声明构造函数obj = constructor.newInstance("hello");

调用类的方法

1.Class对象的getMethods()方法
2.调用Method对象中的Object invoke(Object obj, Object… args)方法.第一个参数表示method对象

代理

分类

静态代理:代理类是在编译时就实现好的
动态代理:代理类是在运行时生成的。

这里写图片描述
目标对象(RealSubject )以及代理对象(Proxy)都实现了主题接口(Subject)。代理对象(Proxy)中拥有目标对象(RealSubject )的实例,在实现主题接口(Subject)的方法中调用目标对象的方法(实现主接口的方法)。
动态代理:

java.lang.reflect.Proxy: 这是生成代理类的主类,Proxy提供了用户创建动态代理类和代理对象的静态方法.
java.lang.reflect.InvocationHandler: 这里称他为”调用处理器”,它是一个接口。当调用动态代理类中的方法时,将会直接转接到执行自定义的InvocationHandler中的invoke()方法。

创建动态代理实例的两种方法:
1.利用constructor.newInstance(handler)

//创建一个InvocationHandler对象        InvocationHandler handler = new MyInvocationHandler(.args..);        //使用Proxy生成一个动态代理类        //第一个参数是类加载器对象(即哪个类加载器来加载这个代理类到 JVM 的方法区),第二个参数是接口(表明你这个代理类需要实现哪些接口),第三个参数是调用处理器类实例(指定代理类中具体要干什么)        Class proxyClass = Proxy.getProxyClass(RealSubject.class.getClassLoader(),RealSubject.class.getInterfaces(), handler);        //获取proxyClass类中一个带InvocationHandler参数的构造器,用于下一步创建代理实例        Constructor constructor = proxyClass.getConstructor(InvocationHandler.class);        //调用constructor的newInstance方法来创建动态实例        RealSubject real = (RealSubject)constructor.newInstance(handler);

2.使用Proxy.newProxyInstance()

//创建一个InvocationHandler对象        InvocationHandler handler = new MyInvocationHandler(.args..);        //使用Proxy直接生成一个动态代理对象        RealSubject real =Proxy.newProxyInstance(RealSubject.class.getClassLoader(),RealSubject.class.getInterfaces(), handler);