JAVA的反射机制

Java反射是Java被视为动态语言的一个关键性质。Java可以加载一个运行时才得知名称的class,获得其完整结构。

 

Reflection API

Java反射相关的API在包java.lang.reflect中

Member接口

该接口可以获取有关类成员(域或者方法)或构造函数的信息。

AccessibleObject类

是域(field)对象、方法(method)对象、构造函数(constructor)对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。

Array类

提供了动态创建和访问JAVA数组的方法。

Constructor类

提供一个类的构造函数的信息以及对它的访问权限。

Field类

提供一个类的域的信息以及对它的动态访问权限。

Method类

提供一个类的方法的信息以及如何访问该方法。

Modifier类

提供了 static 方法和常量,对类和成员访问修饰符进行解码。

Proxy类

提供动态地生成代理类和类实例的静态方法。

 

Java反射机制提供如下功能:

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判段任意一个类所具有的成员变量和方法

在运行时调用任一个对象的方法

在运行时创建新类对象

生成动态代理

在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。


	System.out.println("获取类的Class对象>>>>>>>>>");
        Boolean b1 = Boolean.FALSE;
        Class<?> c = b1.getClass();
        System.out.println(c);

        Class<?> b2 = Boolean.class;
        System.out.println(b2);

        Class<?> c1 = Class.forName("java.lang.Boolean");
        System.out.println(c1);

        Class<?> c2 = Boolean.TYPE;
        System.out.println(c2);

获取类的Class对象>>>>>>>>>
class java.lang.Boolean
class java.lang.Boolean
class java.lang.Boolean
boolean


package test;

/**
 * 父类
 *
 */
public class Animal {
    public String name;
    public int age;
    protected String protectedField;
    String defaultField;
    private String privatedField;

    public Animal() {
        super();
    }

    public Animal(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    protected String getProtectedField() {
        return protectedField;
    }

    protected void setProtectedField(String protectedField) {
        this.protectedField = protectedField;
    }

    String getDefaultField() {
        return defaultField;
    }

    void setDefaultField(String defaultField) {
        this.defaultField = defaultField;
    }

    private String getPrivatedField() {
        return privatedField;
    }

    private void setPrivatedField(String privatedField) {
        this.privatedField = privatedField;
    }

    public String toString() {
        return "Animal [name=" + name + ", age=" + age + "]";
    }

}

package test;

/**
 * 子类
 *
 */
public class Dog extends Animal {
    public int weight;
    protected String protectedValue;
    String defaultValue;
    private String privatedValue;

    public Dog() {
        super();
    }

    protected Dog(String name, int age) {
        super(name, age);
    }

    Dog(int weight) {
        this.weight = weight;
    }

    private Dog(String name, int age, int weight) {
        super(name, age);
        this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    protected String getProtectedValue() {
        return protectedValue;
    }

    protected void setProtectedValue(String protectedValue) {
        this.protectedValue = protectedValue;
    }

    String getDefaultValue() {
        return defaultValue;
    }

    void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }

    private String getPrivatedValue() {
        return privatedValue;
    }

    private void setPrivatedValue(String privatedValue) {
        this.privatedValue = privatedValue;
    }

    private void bark() {
        System.out.println("wang wang wang...");
    }

    public String toString() {
        return "Dog [weight=" + weight + ", name=" + name + ", age=" + age + "]";
    }

}



        System.out.println("获取类的Fields>>>>>>>>>");
        Class<?> d = Dog.class;
        Field[] fields = d.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("获取类的DeclaredFields>>>>>>>>>");
        Field[] fields1 = d.getDeclaredFields();
        for (Field field : fields1) {
            System.out.println(field);
        }

获取类的Fields>>>>>>>>>
public int test.Dog.weight
public java.lang.String test.Animal.name
public int test.Animal.age
获取类的DeclaredFields>>>>>>>>>
public int test.Dog.weight
protected java.lang.String test.Dog.protectedValue
java.lang.String test.Dog.defaultValue
private java.lang.String test.Dog.privatedValue

getFields返回的是该类及其父类中申明为public的属性。

getDeclaredFields返回的是该类中定义的所有属性。


        System.out.println("获取类的Method>>>>>>>>>");
        Method[] methods = d.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("获取类的DeclaredMethod>>>>>>>>>");
        Method[] methods1 = d.getDeclaredMethods();
        for (Method method : methods1) {
            System.out.println(method);
        }

获取类的Method>>>>>>>>>
public java.lang.String test.Dog.toString()
public int test.Dog.getWeight()
public void test.Dog.setWeight(int)
public java.lang.String test.Animal.getName()
public void test.Animal.setName(java.lang.String)
public int test.Animal.getAge()
public void test.Animal.setAge(int)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public boolean java.lang.Object.equals(java.lang.Object)
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
获取类的DeclaredMethod>>>>>>>>>
public java.lang.String test.Dog.toString()
java.lang.String test.Dog.getDefaultValue()
private void test.Dog.bark()
public int test.Dog.getWeight()
public void test.Dog.setWeight(int)
protected java.lang.String test.Dog.getProtectedValue()
protected void test.Dog.setProtectedValue(java.lang.String)
void test.Dog.setDefaultValue(java.lang.String)
private java.lang.String test.Dog.getPrivatedValue()
private void test.Dog.setPrivatedValue(java.lang.String)

getMethods返回该类及其父类超类中申明为public的方法。

getDeclaredMethods返回该类中的所有方法,包括公共、保护、默认()访问和私有方法。


        System.out.println("获取类的Constructor>>>>>>>>>");
        Constructor<?>[] constructors = d.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

        System.out.println("获取类的DeclaredConstructor>>>>>>>>>");
        Constructor<?>[] constructors1 = d.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors1) {
            System.out.println(constructor);
        }

获取类的Constructor>>>>>>>>>
public test.Dog()
获取类的DeclaredConstructor>>>>>>>>>
protected test.Dog(java.lang.String,int)
test.Dog(int)
private test.Dog(java.lang.String,int,int)
public test.Dog()

getConstructors返回该类中所有公共的构造方法。

getDeclaredConstructors返回该类中声明的所有构造方法,包括公共、保护、默认()访问和私有构造方法。


        System.out.println("通过反射机制创建类的实例>>>>>>>>>");

        System.out.println("1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.");
        Class<?> dogClass = Dog.class;
        Object o = dogClass.newInstance();
        System.out.println(o);

        System.out.println("2、调用默认Constructor对象的newInstance方法.");
        Constructor<?> constructorclass = dogClass.getConstructor();
        Object o1 = constructorclass.newInstance();
        System.out.println(o1);

        System.out.println("3、调用带参数Constructor对象的newInstance方法.");
        Constructor<?> constructorclass2 = dogClass.getDeclaredConstructor(String.class, int.class);
        Object o2 = constructorclass2.newInstance("poly", 10);
        System.out.println(o2);
通过反射机制创建类的实例>>>>>>>>>
1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.
Dog [weight=0, name=null, age=0]
2、调用默认Constructor对象的newInstance方法.
Dog [weight=0, name=null, age=0]
3、调用带参数Constructor对象的newInstance方法.
Dog [weight=0, name=poly, age=10]


        System.out.println("调用类的函数>>>>>>>>>");
        Method method1 = dogClass.getMethod("getName");
        System.out.println(method1.invoke(o2));

        System.out.println("调用类的private函数>>>>>>>>>");
        Method method2 = dogClass.getDeclaredMethod("bark");
        method2.setAccessible(true);
        method2.invoke(o2);

        System.out.println("设置/获取类的属性值>>>>>>>>>");
        Field age = dogClass.getField("age");
        age.setInt(o, 8);
        System.out.println(age.getInt(o));
调用类的函数>>>>>>>>>
poly
调用类的private函数>>>>>>>>>
wang wang wang...
设置/获取类的属性值>>>>>>>>>
8




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值