Javaのリフレクション(A)

反射
[クラスのコンストラクタの存在、一般的な方法は、等、属性]の後ろにオブジェクトを介してオブジェクトの情報を取得することである
:クラスクラス -
インタフェース:シリアライズ、GenericDeclaration、タイプ、AnnotatedElementの
-反射動作が完了し、コアクラスは、クラスのクラスです。
-各クラスは、クラスがJVMによってロードされるときに生成される独自のクラス・オブジェクトを有し、ユーザーは、作成できない、得ることができる
[クラスオブジェクトを取得するには、3つの方法]
のgetClass()メソッド(によって提供される1オブジェクトこの方法は、オブジェクトのインスタンス)生成する
の.class 2クラス
にforName()メソッドによって提供される前記クラスが
パブリック静的クラス<?>にforName(文字クラス名) ClassNotFoundExceptionがスロー

public class TestDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        Date date = new Date();
        //1.Object类的getClass方法,此方法要先获得类的对象
        System.out.println(date.getClass());
        //类.class方法
        System.out.println(Date.class);
        //Class的forName方法
        System.out.println(Class.forName("java.util.Date"));
    }
}

Classオブジェクトのクラスを取得した後

反射物体のnewInstance()}によって[実施例1
公共TのnewInstance()がないInstantiationException、スロー IllegalAccessExceptionがを

public class TestDemo {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
      Object cls =  Date.class;
      //拿到Class对象后,调用newInstance()方法
        System.out.println(((Class) cls).newInstance());
    }
}

2. [得られたパッケージ名、親、親インタフェース情報]
1。getPackageクラスパッケージ名を取得-Class()メソッドを提供し
得-Class親クラス2. getSuperclassを(提供)方法
3インタフェース情報を取得する親-ClassでgetInterfacesクラスが提供します()


interface Ilipstick{
}
interface Fruit{
}
class Person{
}
class Student extends Person{

}
class SuperMarker implements Ilipstick,Fruit{
}
public class TestJ{
    public static void main(String[] args) {
    //获得Class对象
        Class<?> cls = Student.class;
        Class<?> cl = SuperMarker.class;
        //获得包信息
        Package p = cls.getPackage();
        System.out.println(p);
        //获得父类信息
        Class<?> c = cls.getSuperclass();
        System.out.println(c.getName());
        //获得父接口信息
        Class[] g = cl.getInterfaces();
        for (Class<?> class1 :g){
            System.out.println(class1.getName());
        }
    }
}

通常の[3.プロパティ、コンストラクタ、メソッド取得]
Personクラス、学生のカテゴリを:

class Person{
    public String name;
    public int age;
}
class Student {
    public String School;
    public String skill;
    private int bob;
    protected String sod;
    public  Student(){}
    public Student(String name){}
    public Student(String name ,int age){}

    public void setSchool(String school) {
        School = school;
    }
    public void setSkill(String skill) {
        this.skill = skill;
    }
    public String getSchool() {
        return School;
    }
    public String getSkill() {
        return skill;
    }
}

1.取得属性
(1)(親クラス) -クラスで行われたすべての属性:publicフィールド[]れるGetFields()は SecurityExceptionをスローします

(2)(このクラス) - 行われたすべてのクラス属性:.パブリックフィールド[] getDeclaredFields()はSecurityExceptionをスロー

public class TestJ{
    public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException {
         Class<?> cls = Class.forName("Student");
        {
            //获得所有的"公有字段",也可取得父类的属性
            Field[] fie1 = ((Class) cls).getFields();
            for (Field fiel : fie1) {
                System.out.println(fiel);
            }
            System.out.println("-----------------------------");
            //取得所有的字段,包含被封装的
            Field[] fie2 = ((Class) cls).getDeclaredFields();
            for (Field field : fie2) {
                System.out.println(field);
            }
        }
    }
}

2.クラスをインスタンス化するときに物体によって反射-Classクラスのコンストラクタを取得し、唯一の引数なしのクラスでコンストラクタを呼び出すことができます
- <?>コンストラクタの国民は[] getConstructors()はSecurityExceptionをスローします
- <?>コンストラクタpublic getConstructor(クラス... parameterTypesパラメータ)
ないNoSuchMethodException、SecurityExceptionをスローします

public class TestJ{
    public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException {
         Class<?> cls = Class.forName("Student");
         //调用类中的全部构造方法
         Constructor<?>[] cons = cls.getConstructors();
         for(Constructor<?> con :cons){
             System.out.println(con);
         }
         System.out.println("------------------");
         //获得指定参数的构造方法
        System.out.println(cls.getConstructor(String.class));
      }
  }

3.取得普通方法
- パブリックメソッド[] getMethods()、SecurityExceptionをスローします
- パブリックメソッドgetMethod(文字列名、クラス... parameterTypesと<?>)
- 调用パブリックオブジェクトの呼び出し(オブジェクトobjは、オブジェクト...引数を)投げるIllegalAccessExceptionが、
はIllegalArgumentException、InvocationTargetExceptionが

public class TestJ{
    public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException {
         Class<?> cls = Class.forName("Student");
         //调用类中的全部普通方法
         Method[] methods = cls.getMethods();
         for(Method method : methods){
             System.out.println(method);
         }
          System.out.println("------------------");
        //获得指定普通方法
        System.out.println(cls.getMethod("setSkill", String.class));
        System.out.println("------------------");
        //调用invoke()方法
        //获得setSchool这个方法的实例化对象,设置方法名与参数
        Method setMethod = cls.getMethod("setSchool", String.class);
        //传入参数
        setMethod.invoke(obj,"清华");
        Method getMethod = cls.getMethod("getSchool");
        Object result = getMethod.invoke(obj);
        System.out.println(result);
    }
}

おすすめ

転載: blog.csdn.net/weixin_43573534/article/details/89811612