本文已参与「新人创作礼」活动,一起开启掘金创作之路。
通过反射调用类中的指定方法、指定属性
-
三、通过反射调用类中的指定方法、指定属性
-
调用指定方法
-
通过反射,调用类中的方法,通过Method类完成。步骤:
- 通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型(...代表参数是0到多个)。
- 之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。
-
举例
- 前提:通过无参构造创建对象
- 想要调用一个公有方法
- 想要调用一个私有方法
- 调用一个重载方法
- 调用有返回值的方法
- 前提:通过无参构造创建对象
-
-
调用指定属性
- 在反射机制中,可以直接通过Field类操作类中的属性,通过Field了提供的set()和get()方法就可以完成设置和取得属性内容的操作
- public Field getField(String name);返回此Class对象表示的类或接口指定的public的Field
- public Field getDeclaredField(String name);返回此Class对象表示的类或接口的指定的Field
-
在Field中的方法
- public Object get(Object obj);取得指定对象obj上此Field的属性内容
- public void set(Object obj,Object value);设置指定对象obj上此Field的属性内容
- public void setAccessible(true);访问私有属性时,让这个属性可见
- 注:在类中属性都设置为private的前提下,在使用set()和get()方法时,首先要使用Field类中的setAccessible(true)方法将需要操作的属性设置为可以被外部访问
-
举例
- 通过构造方法创建对象
- 访问公有属性
- 访问私有属性
- 结果输出
- 通过构造方法创建对象
-
Java动态代理
-
Java动态代理
- Proxy:专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态地生成实现类
- 创建一个动态代理类所对应的Class对象:static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)直接创建一个动态代理对象
- 举例:一个java项目,其中有100个java类,每个java有10个方法,这总共1000个方法。现在有这样一个需求,需要在每个java方法上加上2句话,在方法执行前输出这个方法开始执行,在方法执行后输出这个方法已经完成。
-
举例:
- 第一步:创建一个ITestDemo接口
- 第二步:创建一个TestDemoImpl类实现接口
- 第三步:创建一个ProxyDemo动态代理类
- 第四步:创建test2测试类
- 第五步:结果输出
- 第一步:创建一个ITestDemo接口
-
注意:
- 如果一个对象想要通过Proxy.newProxyInstance方法被代理,那么这个对象的类一定要有相应的接口,就像本例中的ITestDemo接口和实现类TestDemoImpl
- Proxy.newProxyInstance(ClassLoader, interfaces, h); 参数1是代理对象的类加载器,参数2是被代理对象的接口,参数3是代理对象,返回的值就是成功被代理后的对象,返回的是object类型,需要根据情况转换类型。