java反射及应用

通过JAVA反射能够知道这个类的所有属性和方法,并能够调用它的任意方法,这样就能够动态的获取对象信息以及动态调用对象的方法,所以说反射是Java被视为准动态语言的关键性质。反射的核心就是允许在运行时通过Java Reflection API来取得已知名字的Class类的相关信息,动态地生成此类。注意,这个类几乎所有的信息都能获取,如class隶属哪个package、class导入哪些classes、methods/fields的属性、类名/接口名、参数类型等
一般操作类的方法是类似这样的:

User user = new User();
user.show("hello");
User.show1("hello", "world");//静态方法

应用反射则是这样的

//通過反射創建對象
Class clz = Class.forName("com.ljfbest.model.User");
User user=(User) clz.newInstance();

//通過反射執行方法第一个参数是函数名称,第二个参数是...(表示有无限个参数)表示函数的参数
Method method=clz.getMethod("show",String.class);
method.invoke(user, "hello");//第一个参数是调用函数的对象,第二个参数是函数执行时的参数

//调用static方法
Method method1=clz.getMethod("show1", String.class,String.class);
method1.invoke(User.class, "hello","world");// 调用Static的方法是使用class来调用

反射在工厂模式、代理模式、struts2、springMVC中均有很重要的应用

 

用注解和反射实现ioc(依赖注入),有关注解(http://www.ljfbest.com/archives/201),实现将Abc类注入到DemoAnnotation

注解类:

@Retention(RetentionPolicy.RUNTIME)//这个注解要写,参数不通是其它
public @interface ShopDi {
	String dao() default "";
}

被注入的类:

public class DemoAnnotation {
	private Abc abc; // 实现ioc,将abc注入

	@ShopDi(dao = "abc")
	public void setAbc(Abc abc) {
		this.abc = abc;
		System.out.println(this.abc);
	}

	@Test
	public void te() {
		Method[] m = this.getClass().getDeclaredMethods();// 用反射获取此类的方法
		for (Method n : m) {
			if (n.isAnnotationPresent(ShopDi.class)) {// 是否有ShopDi注解
				ShopDi sd = n.getAnnotation(ShopDi.class);// 获取注解信息
				String v = sd.dao();// 获取注解属性值

				if (v == null || "".equals(v.trim()))
					v = n.getName().substring(3);
				else
					v = v.substring(0, 1).toUpperCase() + v.substring(1);

				try {
					Class clz = Class.forName("junit.test." + v);// 加载Abc类
					Abc aa = (Abc) (clz.newInstance());
					n.invoke(this, aa);// 执行此方法
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

在不使用框架的情况下,使用反射加注解可以自己实现简单的SpringMVC结构,极大简化代码,优化结构

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值