获取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

posted on 2021-07-06 10:37  邢帅杰  阅读(52)  评论(0编辑  收藏  举报