本人菜鸟一枚,对于学到的东西总爱记录下来,这里贴出一些java反射相关的知识
首先是class对象,对于加载到内存中的任何一个类,虚拟机都会在加载类的同时,创建一个class对象与该类对应,这个class对象中保存了这个类的信息。
获取class对象:(Class类在java.lang包中,可以通过查看API了解其用法)
// 第一步,获取class对象
// Demo d=new Demo();//自定义的类
// Class clazz=d.getClass();//第一种
// Class clazz=Demo.class;//第二种
// Class clazz=Class.forName("reflect.Demo");//第三种
// System.out.println(clazz);
在
java.lang.reflect包下有三个反射相关的类Constructor(对应类的构造函数),Field(对应类中的属性),Method(对应类中的方法),通过这三个类可以得到类的属性和方法等信息。下面介绍如何使用它们
//获取类的构造函数
// public Constructor<T> getConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException这个方法可以获得类的公共构造//函数
// public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException这个方法可以获取所有//构造函数,包括私有的
// 这里要说明的是Class<?>... parameterTypes是个可变参数,即参数的个数是可变的,这是jdk5的新特性
// Constructor constructor1=clazz.getConstructor();//获取无参的构造函数
// Constructor constructor2=clazz.getConstructor(int.class);//获取有参的构造函数
// Constructor constructor3=clazz.getDeclaredConstructor(int.class,String.class);//获取私有的构造函数
// Constructor[] constructors=clazz.getConstructors();//获取所有公共的构造函数
// for(Constructor con:constructors){
// System.out.println(con);
// }
// Constructor[] constructors1=clazz.getDeclaredConstructors();//获取所有的构造函数,包括私有的
// for(Constructor con:constructors1){
// System.out.println(con);
// }
接下来就可以利用这些构造函数做一些事情了,比如创建一个类的实例
// Demo d=(Demo) constructor1.newInstance();
// d.show();
// Demo d1=(Demo)constructor2.newInstance(22);
// System.out.println(d1.getAge());
// constructor3.setAccessible(true);//constructor3是个私有构造函数,要先把它设置为true,取消java的语法检查
// Demo d2=(Demo)constructor3.newInstance(22,"flying");
// System.out.println(d2.getAge());//看看,通过反射机制,连私有的构造函数都可用了,然而反射的功能不只在这,它主要是可以动态获取类的信息,接触过框架的同学应该知道
// 获取类的方法,和获取构造函数类似
// Method m1=clazz.getMethod("show");
// Method m2=clazz.getDeclaredMethod("show1", String.class);
// Method[] m3=clazz.getMethods();
// Method[] m4=clazz.getDeclaredMethods();
// 调用方法
// Demo demo=new Demo();
// m1.invoke(demo);
// m2.setAccessible(true);//和构造函数一样
// m2.invoke(demo, "helloworld");
// //获取类的属性
// Field f1=clazz.getField("name");
// Field f2=clazz.getDeclaredField("age");
// Field[] f3=clazz.getFields();
// Field[] f4=clazz.getDeclaredFields();
// //为属性设置参数
// f1.set(demo, "gaohui");
// System.out.println(demo.name);
// f2.setAccessible(true);
// f2.set(demo, 22);
// System.out.println(demo.getAge());
最后贴出我Demo类的代码
package reflect;
public class Demo {
private int age;
public String name;
public Demo(){
System.out.println("默认构造函数");
}
public Demo(int age){
this.age=age;
}
private Demo(int age,String name){
this.age=age;
this.name=name;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name=name;
}
public void show(){
System.out.println("这里是测试方法");
}
private void show1(String message){
System.out.println(message);
}
}
第一次写,写的不好,哈哈哈