反射小demo和动态代理

Posted liushisaonian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射小demo和动态代理相关的知识,希望对你有一定的参考价值。

反射小DEMO

xx.properties

type=com.itheima.reflect.LoginServiceImpl
func=eat
paramType=java.lang.String
package com.itheima.reflect;

public class LoginServiceImpl implements LoginService {

	@Override
	public void say() {
		System.err.println("say无参数");
	}

	@Override
	public void say(String name) {
		System.err.println("有参数"+name);
	}

	@Override
	public void eat(String food) {
		System.err.println("food"+food);
	}

	@Override
	public String speak(String name) {
		return "hello"+name;
	}

}
package com.itheima.reflect;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectDemo {

	public static void main(String[] args) throws Exception {
		// 读取配置文件
		Properties pro = new Properties();
		pro.load(ReflectDemo.class.getClassLoader().getResourceAsStream("xx.properties"));

		String type = pro.getProperty("type");
		String fnuc = pro.getProperty("func");
		String paramType = pro.getProperty("paramType");
		
		// 获取class
		Class<?> forName = Class.forName(type);
		Object instance = forName.newInstance();
		// 方法
		Method method = forName.getMethod(fnuc, Class.forName(paramType));
		// 参数
		method.invoke(instance, "狗蛋儿");
	}
}

动态代理

package com.itheima.reflect;

import java.lang.reflect.Proxy;

public class ProxyDemo {

	/**
	 * 动态代理
	 */
	public static void main(String[] args) {
		
		//构造一个动态代理的对象
		LoginService log =(LoginService) Proxy.newProxyInstance(LoginService.class.getClassLoader(), 
				new Class<?>[]{LoginService.class}, new MyInvocationHandler() );
		
		log.eat("三明治");
		String speak2 = log.speak("speak");
		System.err.println(speak2);
		String speak = log.speak("sayha");
		System.err.println(speak);
		log.say();
	}
	
	

}
package com.itheima.reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//在这里面进行测试
		if(method.getName().equals("eat")){
			System.err.println("我一点都不喜欢"+args[0]);
		}
		if (method.getName().equals("speak")) {
			String speak = new LoginServiceImpl().speak((String) args[0]);
			return speak;
		}
		
		if (method.getName().equals("say")) {
			if (method.getParameterTypes().length > 0) {
				System.out.println("我爱死" + args[0] + "了");
			} else {
				System.out.println("你调的是say()方法,但是我就打印这句话了");

			}

		}
		return null;
		
	}

}

  

以上是关于反射小demo和动态代理的主要内容,如果未能解决你的问题,请参考以下文章

动态代理

Java学习:动态代理的一点小理解

插件化知识详细分解及原理 之代理,hook,反射

深圳某小公司:Java反射 && 动态代理

(java反射-JDK动态代理)+CGLIB动态代理

简谈Java 反射机制,动态代理