获取Class的方式:Class c1 = String.class;(很少用)Class c2 = person.getClass();Class c3 = Class.forName(String classPath);(参数是类的完全限定名,提现反射的动态性)
Class实例对应着加载到内存中的一个运行时类。
创建Class对应运行时类的对象的通用方法,Person类必须要有空参构造函数,且修饰符的权限要够,一般是public的。
创建Class方式:
1、Class.forName("com.jay.ct.Person")
2、new Person().getClass()
3、Person.class
4、Person.class.getClassLoader().loadClass("com.jay.ct.Person")
Class class1 = Class.forName("com.jay.ct.Person"); Object obj = class1.getDeclaredConstructor().newInstance();//java9之后推荐写法 Method show = class1.getMethod("show", String.class);
show.setAccessible(true); Object res = show.invoke(obj, "123456");//res就是show方法return的值
静态代理和动态代理
package com.jay.ct; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicAgentTest { public static void main(String[] args) throws Exception { // 静态代理 // LiNingFac lnFac = new LiNingFac(); // ProxyClothFac pfac = new ProxyClothFac(lnFac); // pfac.produceCloth(); // 动态代理 Constructor<?> cons = Class.forName("com.jay.ct.LiNingFac").getDeclaredConstructor(); cons.setAccessible(true); Object lnFac = cons.newInstance(); Object obj = ProxyFac.getProxyInstance(lnFac); ClothFac fac = (ClothFac) obj; fac.produceCloth(); } } interface ClothFac { void produceCloth(); } //动态代理类 class ProxyFac { // 参数 obj 是被代理类对象,返回的是代理类对象 public static Object getProxyInstance(Object obj) { // 注册被代理类的invoke方法 MyInvocationHandler ih = new MyInvocationHandler(); ih.bind(obj); Object p = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), ih); return p; } } class MyInvocationHandler implements InvocationHandler { private Object obj; public void bind(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object res = method.invoke(obj, args); return res; } } //静态代理类 class ProxyClothFac implements ClothFac { public ProxyClothFac(ClothFac fac) { super(); this.fac = fac; } private ClothFac fac; public ProxyClothFac() { } @Override public void produceCloth() { System.out.println("代理工厂开始"); this.fac.produceCloth(); System.out.println("代理工厂结束"); } } class LiNingFac implements ClothFac { @Override public void produceCloth() { System.out.println("LiNing工厂生产"); } }