获取一个class所对应的Class有如下方法,每个class都有此getClass()方法
1.getClass()
String str = "accp";
Class c = str.getClass();
System.out.println(c);
//the result is : java.lang.String
即字符串所对应的Class为java.lang.String
2 getSuperClass()
获取指定类的父类所对应的Class
如果你对一个Object类调用getSuperClass(),你觉得会返回什么呢?
答案是: null
因为Object已经是所有类的父类,没有比它更高的,你这么调用的话
当然会返回null
3 Class.forName() 这个方法不陌生把
其中的参数必须是完整的包名加类名
Class.forName(java.lang.String); // return the Class of java.lang.String
4 .class 语法
起基本用法为: 类名+ ".class",返回此类所对应的Class
Class c1 = String.class;
Class c2 = int[].class; //因为数组也是引用类型
Class c3 = float.class; //原生类型也是可以的
5 原生数据类型的包装类
Class c1 = Boolean.TYPE;
Class c2 = Integer.TYPE;
Class c3 = Float.TYPE;
所有原生类型都可以用".TYPE"这种形式得到其对应的Class
当然用前面的方法也是可以的哦~
这5种方法说的差不多了把
我们再来看看如何在得到Class后,来生成特定类的实例
如果构造函数的参数为空,则可以用如下方法获取其实例
Student是一个类,有一个睡觉的方法 sleep() 其有个参数为空的构造方法
A: Class c = Class.forName("Student");
Student s = (Student) c.newInstance();
s.sleep();
我们可以用另一种写法,一样的效果,嘎嘎
B: Class c = Class.forName("Student");
Object obj = null ;
obj = c.newInstance(); //newInstance()方法返回的是Object类型
Student s = (Student) obj ;
s.sleep();
这样通过反射就可以得到实例
上面是针对没有参数的构造函数,如果有参数呢?
我们假设Student类有一个构造函数:Student(String name,Integer age);
Class c = Class.forName("Student"); //首先还是一样,获取类的Class
Class[] params = new Class[]{String.TYPE,Integer.TYPE}; //这两个参数对应构造函数中的那2个参数
Constructor ctor = c.getConstructor(params); //根据参数获取一个Constructor对象
Student s = (Student) ctor.newInstance(new Object[]{"admin",22}); 这样我们仍然可以得到Student的一个实例
s.sleep();
前面所说的是针对类的实例
下面来说说针对方法以及方法中的属性的例子
public String run(String name){
return name+"在听音乐。。。。。。" ;
}
方法:
Class c = Class.forName("Student");
Class params[] = new Class[]{String.TYPE};
Method m = c.getMethod("run","admin"); //第一个方法为指定类中的哪个方法的实例,第二个参数为此方法中的参数
Student stu = new Student () ;
String r = (String)m.invoke(stu,params); //第一个参数为调用哪个类的对象,第二个参数为此方法中的参数
此方法返回指定方法的返回值
System.out.println(r); //打印出来就是:admin在听音乐。。。。。。
运行时生成属性对象
我们的Student类有一个属性为String name
Class c = Class.forName("Student");
Field f = c.getField("name");
Student s = new Student();
System.out.println(f.get(s)); //取值
f.set(s,"admin"); //存值
--------------------------------------------------------------
反射取得属性:
protected void test( Object entity) throws IllegalArgumentException, IllegalAccessException {
Field[] fs = entity.getClass().getDeclaredFields(); // 取得属性
///fs[0].setAccessible(fs, true); //设置所的属性都可读写
for (Field f : fs) {
if (f.getType().equals(java.lang.String.class)) {
f.setAccessible(true); // 设置true,可以读写
f.set(entity, "accp"); // 重新给值
System.out.println(f.get(entity)); // 获取属性
}
}
}
///方法 Field getDeclaredField(String name):返回已加载类声明的所有成员变量的Field对象,不包括从父类继承的成员变量,参数name指定成员变量的名称.