通过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结构,极大简化代码,优化结构