Java反射 之 反射基础

反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。对于反射的操作实际上就是通过Class对象获取:

*a、java.lang.reflect.Field:提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。操作类的成员变量。
 *b、java.lang.reflect.Constructor<T>:操作类的够造函数。
 *c、java.lang.reflect.Method:操作类的方法。

在学习反射基础前先创建一个Person对象作为实例:

package com.linuxidc.org.base.relfect;

public class Person {
    private String name;
    int age;
    public String address;

public Person() {
    }

private Person(String name) {
        this.name = name;
    }

Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

public void show() {
        System.out.println("show");
    }

public void method(String s) {
        System.out.println("method " + s);
    }

public String getString(String s, int i) {
        return s + "---" + i;
    }

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

@Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address
                + "]";
    }

}

二、获取类的Class对象

public static void getClassObject() throws ClassNotFoundException{
        //方式一:Object的getClass()方法
        Person person1=new Person();
        Person person2=new Person();
        Class c1=person1.getClass();
        Class c2=person2.getClass();
        System.out.println(person1==person2);//false
        System.out.println(c1==c2);//true 不管JVM内存中有多少个对象,对于字节码文件来说只有一份
        //方式二:数据类型的静态class属性
        Class c3=Person.class;
        System.out.println(c1==c3);//true
        //方式三:Class 类的静态方法
        //public static Class<?> forName(String className)throws ClassNotFoundException
        Class c4=Class.forName("com.linuxidc.org.base.relfect.Person");
        System.out.println(c1==c4);//true
    }

三、java.lang.reflect.Constructor<T>:对象并使用Constructor类。

1、获取Constructor对象

//获取Class 对象所表示的类的构造方法
    public static void getConstructorTest() throws  Exception{
        Class c4=Class.forName("com.linuxidc.org.base.relfect.Person");
        //1、获取Class 对象所表示的类所有公共构造方法
        //public Constructor<?>[] getConstructors() throws SecurityException
        Constructor [] cs=c4.getConstructors();
        //2、获取Class 对象所表示的类所有构造方法
        //public Constructor<?>[] getDeclaredConstructors() throws SecurityException
        Constructor[] cs2 =c4.getDeclaredConstructors();
        //3、获取Class对象所表示类的指定指定公共构造方法,  parameterTypes 参数是 Class 对象的一个数组 ,是指定数据类型的字节码
        //public Constructor<T> getConstructor(Class<?>... parameterTypes);
        Constructor cs3=c4.getConstructor();//获取公共的无参构造方法的Constructor对象
        //获取 该 构造函数  public Person(String name, int age, String address)
        Constructor cs4=c4.getConstructor(String.class,int.class,String.class);
        //4、获取Clss对象所表示类指定的构造范法官 parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形参类型的字节码。
        //public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);
        //获取该构造 函数 private Person(String name)  的Constructor对象
        Constructor cs5=c4.getDeclaredConstructor(String.class);
       
    }

2、通过 Constructor 对象创建Class对象所表示类的实例

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/084df29c1974c16f725d0cc4c29b8023.html