java反射机制运用到BaseDao等通用基类

来源:互联网 发布:徽章制作软件app 编辑:程序博客网 时间:2024/05/01 17:34

反射中主要应用的方法:

1.获取类的Class对象

 推荐使用: 第一种。通过Class.forName获取Class对象.
 
  //方式1:通过Class.forName获取Class对象.
Class clazz1 = Class.forName("cn.itcast.reflect.Person");
// System.out.println("clazz1:"+clazz1.getSimpleName());

//方式2:可以通过类名获取Class对象。
Class clazz2 = Person.class;
System.out.println("是同一个对象吗?"+(clazz1==clazz2));

//方式3: 可以通过对象获取Class对象
clazz.newInstance()//获取对象

2.获取类中所有的方法
Method[] methods =  clazz.getMethods();  // 获取所有公共 的方法,包括继承下来的方法。
Method[] methods = clazz.getDeclaredMethods(); //获取所有的方法,包括私有的,但是不包括继承下来的方法。 
for(Method m : methods){
System.out.println(m);
}
Person p =  new Person("狗娃",12);
//获取单个方法
Method m = clazz.getMethod("eat", int.class,String[].class) ; //第一个参数是方法名, 第二参数是形参列表的数据类型。
//执行一个方法
Person p =  new Person("狗娃",12);
m.invoke(p, 3,new String[]{"aa","bb"}); //第一个参数:方法的调用者对象, 第二参数: 方法执行所需要的参数。
Method m = clazz.getMethod("sleep", int.class);//获取其中名为sleep的方法
m.invoke(null, 23);//调用sleep方法

这里书写关于反射应用的通用基类:(同时一样可以运用于通用工具类)

private Class<T> clazz;

public BaseDaoImpl(){
//获取当前运行类泛型父类类型,即为参数化类型,有所有类型公用的高级接口Type接收!
Type type = this.getClass().getGenericSuperclass();
//强转为参数化类型
ParameterizedType param = (ParameterizedType)type;//BaseDao<Department>
Type[] types = param.getActualTypeArguments();//获取BaseDao中的泛型,因为可能有多个所以为数组
clazz = (Class<T>) types[0];//取第一个泛型,即Department赋给clazz
}

通过创建BaseDaoImpl对象类之后,通过构造方法会将泛型中调用的对象的Class对象封装到定义好的clazz中,

接下来就可以在下面的方法书写时调用这个类。

0 0
原创粉丝点击