java 反射 及动态代理
class Foo{}
Foo foo1=new Foo();
在面向对象世界里,万事万物皆对象
类也是对象,是java.lang.Class类的对象,任何一个类都是Class的实力实例对象,这个实例对象有三种表示方式,
(1)Class s1=Foo.class # 每一个类都有一个隐含的静态变量class
(2)Class s2=foo1.getClass();#s1,s2是Foo类的类类型 s1==s2 True,一个类只可能是class类的一个实例对象,所以是s1==s2
(3)Class s3=Class.forName("com.gjl.entity.Foo")
创建实例:Foo foo=(Foo)s1.newInstance()#此类必须要有午无参构造方法,因为他要调用无参构造方法
new 对象是静态加载类,反射是动态加载类
class A{
public void add(int a,int b){
System.out.print(a+b);
}
}
A a1=new A()
==================================================
Class c1=Class.forName("com.gjl.entity.A")
Method m1=c1.getMethod("add",int.class,int.class)#获取类的public方法
Method m1=c1.getMethod("add",new Class[]{int.class,int.class})
Object o=m1.invoke(a1,new Oblect[]{10,12})#打印22
代理模式(通过代理静默地解决一些业务无关的问题,比如远程、安全、事务、日志、资源关闭……让应用开发者可以只关心他的业务)
静态代理:事先写好代理类,可以手工编写,也可以用工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。
动态代理:运行时自动生成代理对象。缺点是生成代理代理对象和调用代理方法都要额外花费时间。
JDK动态代理:基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象。新版本也开始结合ASM机制。
cglib动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类。
Java 发射机制的常见应用:动态代理(AOP、RPC)、提供第三方开发者扩展能力(Servlet容器,JDBC连接)、第三方组件创建对象(DI)……
创建jdk 动态代理步骤