- A+
所属分类:Java

反射机制定义
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。
反射机制获取类的三种方式
1.类名.class
//通过类名.class获取类信息 Class c = Car.class; //获取类方法 Method[] methods = c.getMethods(); //打印方法名称 for(Method method : methods){ System.out.println(method.getName()); }
2.通过对象的getClass()方法获取
//创建对象实例 Car car = new Car(); //通过对象的getClass()方法获取类信息 Class c = car.getClass(); //获取类的构造函数 Constructor[] con = c.getConstructors(); //打印构造函数的名称 for(Constructor cc:con){ System.out.println(cc.getName()); }
3.通过全类名获取Class.forName()
//通过全类名Class.forName获取类信息 Class c = Class.forName("classDemo.Car"); //通过class中的netInstance()方法实例化Car对象 Car o = (Car)c.newInstance(); //调用car对象中的test()方法 o.test();
使用场景
跨网络的远程平台创建和运行对象的能力,即远程方法调用(RMI)
逆向工程
基于注解实现的框架
动态代理
代理:基本的设计模式之一,它是为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。代理通常充当着中间人的角色。
public interface objectDemo { public void doSomething(); } /** * 被代理实现类 * @author liumengxi * * 2017-12-31 */ public class objectDemoImpl implements objectDemo { @Override public void doSomething() { System.out.println("objectDemoImpl"); } } /** * 代理实现类 * @author liumengxi * * 2017-12-31 */ public class proxyObjectDemoImpl implements objectDemo { private objectDemoImpl dl; public proxyObjectDemoImpl(objectDemoImpl dl){ this.dl = dl; } @Override public void doSomething() { System.out.println("proxyObjectDemoImpl dosomething...."); dl.doSomething(); } } /** * 测试 * @author liumengxi * * 2017-12-31 */ public class proxyObjectMain { public static void consumer(objectDemo od){ od.doSomething(); } /** * @param args */ public static void main(String[] args) { //执行被代理类方法 consumer(new objectDemoImpl()); //执行代理类方法 consumer(new proxyObjectDemoImpl(new objectDemoImpl())); } }
动态代理:动态的创建代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的对策。
/** * 动态代理 * @author liumengxi * * 2017-12-31 */ public class DynamicProxyHandler implements InvocationHandler { private Object proxid; public DynamicProxyHandler(Object proxid){ this.proxid = proxid; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //mthod.invoke将请求转发给被代理对象执行 return method.invoke(proxid, args); } } /** * 测试 * @author liumengxi * * 2017-12-31 */ public class proxyObjectMain { public static void consumer(objectDemo od){ od.doSomething(); } /** * @param args */ public static void main(String[] args) { //执行被代理类方法 objectDemoImpl od = new objectDemoImpl(); consumer(od); /** * 创建动态代理 * Proxy.newProxyInstance()可以创建动态代理 * 以下为newProxyInstance参数 * objectDemo.class 类加载器 * new Class[]{objectDemo.class} 该代理实现的接口 * DynamicProxyHandler InvocationHandler接口的一个实现 */ objectDemo o = (objectDemo) Proxy.newProxyInstance(objectDemo.class.getClassLoader(), new Class[]{objectDemo.class}, new DynamicProxyHandler(od)); consumer(o); } }
- 我的微信
- 加好友一起交流!
-
- 微信公众号
- 关注公众号获取分享资源!
-