获取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();
}
//动态代理类,绑定被代理类对象,注册invoke方法,返回代理类对象
class ProxyFac {
// 参数 obj 是被代理类对象,返回的是代理类对象
public static Object getProxyInstance(Object obj) {
// 注册被代理类的invoke方法
ProxyInvocationHandler ih = new ProxyInvocationHandler();
ih.bind(obj);
Object p = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), ih);
return p;
}
}
//重写被代理类invoke方法
class ProxyInvocationHandler 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工厂生产");
}
}
参考:https://blog.csdn.net/spade_Kwo/article/details/122293415
浙公网安备 33010602011771号