一.反射
我们通常都是利利⽤用new ⽅方式来创建对象实例例,这可以说就是⼀一种“正射”,这种⽅方式在编译时候就确定了了类型信息。
⽽而如果,我们想在时候动态地获取类信息、创建类实例例、调⽤用类⽅方法这时候就要⽤用到反射
二.反射原理
Java程序运行分为编译和运行两个步骤,编译后生成字节码文件,JVM操作加载字节码文件,将类型相关的信息加载进入方法区,反射是获取这些信息,进行操作。
三.实际应用
1.连接数据库驱动,使用反射完成(
class.forName(mysql),这样更换数据库时,不需要更改程序代码,程序不需要重新编译就能运行。
因为反射是动态编译的,程序运行期间生成指定类的对象,
这样就可以程序运行期间生成不同的数据库驱动程序对象。省去了固定写死一个数据库驱动对象(通过new 构造函数的方法),造成每更换一个数据库,要重新编译代码的问题
)
2.spring中的注解,xml配置等是由反射实例化对象
3.springAOP代理设计模式创建对象
三.使用反射实现动态代理
public class DynamicProxy implements InvocationHandler { private Object mobject; public DynamicProxy(Object o){ this.mobject = o; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(mobject,args); return result; } }
public interface IRoom { void seekRoom();//找房 void watchRoom();//看房 void room();//给钱租房 void finish();//完成租房 }
public class XiaoMing implements IRoom{ @Override public void seekRoom() { System.out.println("找房"); } @Override public void watchRoom() { System.out.println("看房"); } @Override public void room() { System.out.println("给钱租房"); }
//构造用户 XiaoMing xiaoMing = new XiaoMing(); //构造一个动态代理 InvocationHandler dynamicProxy = new DynamicProxy(xiaoMing); //获取被代理的类的 classLoader ClassLoader classLoader =xiaoMing.getClass().getClassLoader(); //new ProxyInstance 动态构造一个代理 //传入的类加载器动态生成代理对象实例 IRoom roomAgency = (IRoom) Proxy.newProxyInstance(classLoader,new Class[]{IRoom.class},dynamicProxy); roomAgency.watchRoom(); roomAgency.seekRoom(); roomAgency.room(); roomAgency.finish();
引用:
https://blog.51cto.com/u_15060533/3938238
标签:反射,void,Object,代理,IRoom,new,public From: https://www.cnblogs.com/developS/p/17629459.html