运行时类型鉴定
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。主要是通过Class类来实现的。
- 获取类对象Class对象方法
Class clazz = Class.forName("com.*.*.*"); //函数参数为带包名的类名
Class clazz = ClassA.class; // ClassA为类名
Class clazz = a.getClass(); // a为类实例
每个类有且仅有一个Class对象存储类型信息。
判断类是否是某个类或者其子类
String s = "test instanceof!";
boolean isObject = s instanceof Object;
instanceof作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据
反射
java可以获取对象的方法,字段,并对其进行调用,这就是反射功能。
- 反射的详细例子
package com.test.reflect;
public class Reflect1 {
private int a;
private String b;
public int c;
public char d;
public void setA(int a) {
this.a = a;
}
public int getA() {
return this.a;
}
public void setB(String b) {
this.b = b;
}
public String getB() {
return this.b;
}
}
package com.test.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReflect {
public static void main(String[] args) {
try {
// 根据类名获取Class
Class clazz = Class.forName("com.test.reflect.Reflect1");
// 获取类的方法
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println("class method: " + method);
}
// 创建一个新的实例
Object test1 = clazz.newInstance();
methods[0].invoke(test1, 10);
System.out.println(methods[1].invoke(test1));
// 获取字段(仅包含public的)
Field[] fields = clazz.getFields();
System.out.println("field length: " + fields.length);
for (Field field : fields) {
System.out.println("class field: " + field);
}
// 给实例的字段赋值
Field field1 = clazz.getField("c");
field1.set(test1, 100);
System.out.println(field1.get(test1));
}
catch (ClassNotFoundException e) {
System.out.println("class not found!");
}
catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
finally {
}
}
}