java运行时类型鉴定和反射

时间:2023-02-02 03:07:16

运行时类型鉴定

运行时类型识别(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 {

        }
    }
}