Heim >Java >JavaBase >Java führt das Erhalten von Klasseninformationen durch Reflektion ein

Java führt das Erhalten von Klasseninformationen durch Reflektion ein

coldplay.xixi
coldplay.xixinach vorne
2021-02-26 10:36:492360Durchsuche

Java führt das Erhalten von Klasseninformationen durch Reflektion ein

Kostenlose Lernempfehlungen:

Inhaltsverzeichnis

1. Feld abrufen

    2. Auf Objekteigenschaften zugreifen durch Reflexionsmechanismus
  • 4. Parameter mit variabler Länge
  • 6. Reflexionsmechanismus ruft Methode auf
  • 9. Reflexionsmechanismus ruft Konstruktor auf
  • die übergeordnete Klasse und die übergeordnete Schnittstelle
  • Im vorherigen Abschnitt haben wir die Details des Reflexionsmechanismus vorgestellt. In diesem Abschnitt stellen wir den Erwerb von Klassenattributen, Methoden und anderen Informationen durch Reflexion vor.
  • 1. Feld abrufen
public class ReflectTest03 {
    public static void main(String[] args) throws Exception{
        //1.获取整个类
        Class studentClass=Class.forName("cn.yujie.bean.Student");
        String className=studentClass.getName();
        System.out.println(className);
        System.out.println(studentClass.getSimpleName());

        //获取类中的所有public的Field
        Field[] fields=studentClass.getFields();
        System.out.println(fields.length);      //测试数组中只有1个元素
        //测试这个field
        Field f=fields[0];
        //取出field的它的名字
        String fieldName=f.getName();
        System.out.println(fieldName);

        //获取所有的Field
        //获取所有的Field
        Field[] fs=studentClass.getDeclaredFields();
        System.out.println(fs.length);
        System.out.println("-----------------");
        //遍历
        for(Field field :fs){
            //获取属性的修饰符列表
            //返回的修饰符是一个数字,每个数字是修饰符的代号
            int i=field.getModifiers();
            //可以将这个代号数字转换成字符串
            String ModifierString = Modifier.toString(i);
            System.out.print(ModifierString+" ");
            //获取属性的类型
            Class fieldType=field.getType();
            String fName=fieldType.getSimpleName();
            System.out.print(fName+" ");
            //获取属性的名字
            System.out.println(field.getName()+" ");
            System.out.println();
        }
    }}
  • 2. Feld dekompilieren
  • Dekompilieren Sie die Attribute einer Klasse über den Reflexionsmechanismus d Meister:

    So greifen Sie über den Reflexionsmechanismus auf die Eigenschaften eines Objekts zu

    Weisen Sie dem Eigenschaftssatz einen Wert zu

    Erhalten Sie den Wert der Eigenschaft get

    public class ReflectTest05 {
        public static void main(String[] args) throws Exception{
            //创建这个是为了拼接字符串
            StringBuilder s=new StringBuilder();
            Class studentClass=Class.forName("cn.yujie.bean.Student");
            s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+"{");
            Field[] fields=studentClass.getDeclaredFields();
            s.append(";\n");
            for(Field field:fields){
                s.append("\t");
                s.append(Modifier.toString(field.getModifiers()));
                s.append(" ");
                s.append(field.getType().getSimpleName());
                s.append(" ");
                s.append(field.getName());
                s.append(";\n");
            }
            s.append("}");
            System.out.println(s);
        }}

    4. Variable Längenparameter

    Java führt das Erhalten von Klasseninformationen durch Reflektion einint… args ist der Parameter variabler Länge

    Die Syntax lautet: Typ... (Hinweis: Es müssen 3 Punkte sein)

    1 Die Anzahl der für Parameter variabler Länge erforderlichen Parameter beträgt 0-n


    2 . Parameter mit variabler Länge Es muss sich an der letzten Position in der Parameterliste befinden und es darf nur ein Parameter mit variabler Länge vorhanden sein

    public class ReflectTest07 {
        public static void main(String[] args) throws Exception{
    
            Class studentClass=Class.forName("cn.yujie.bean.Student");
            //使用反射机制,怎么取访问一个对象的属性
            Object obj=studentClass.newInstance();  //obj就是student对象(底层调用无参数构造方法)
            //获取no属性(根据属性的名称获取Field)
            Field noFiled=studentClass.getDeclaredField("no");
            //给obj对象(Student对象)的no属性赋值
            //s.no=111;         //给s对象的no属性赋值111,三要素,对象,属性和值
            //虽然使用了反射机制,但是三要素还是缺一不可
            //注意,反射机制让代码复杂了,但是为了一个灵活,这也是值得的。
            noFiled.set(obj,222);           //给obj对象的no属性赋值222
            //读取属性的值
            //两个要素:获取obj对象no属性的值
            System.out.println(noFiled.get(obj));
            //可以访问私有属性吗
            Field nameField=studentClass.getDeclaredField("name");
            //打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会)
            nameField.setAccessible(true);
            //给name属性赋值
            nameField.set(obj,"jackson");
            //获取name属性的值
            System.out.println(nameField.get(obj));
    
        }}

    5. 6. Dekompilieren (verstehen) Der Reflexionsmechanismus macht den Code in Zukunft vielseitiger. Die erstellten Objekte und die aufgerufenen Methoden werden unterschiedlich sein, aber der Java-Code muss in keiner Weise geändert werden Charme der Reflexion
    .
    public class ArgumentsTest {
        public static void main(String[] args) {
          m();
          m(10);
          m(20,40);
          //m("abc");编译错误
          m3("ab","cd","def","de9");
          String [] strs={"a","b","c"};
          m3(strs);
        }
        public static void m(int... args){
    
        }
        //必须在最后一个,且只有1个//    public static void m2(String... args1,int...args2){////    }
        public static void m3(String ...args){
            //可以将可变长度参数当成一个数组来看
            for(int i=0;i<args.length></args.length>
    8. Reflexionskonstruktor

    public class ReflectTest08 {
        public static void main(String[] args) throws Exception{
            //获取类了
            Class userServiceClass = Class.forName("cn.yujie.service.UserService");
            //获取所有的Method(包括私有的)
            Method[] methods=userServiceClass.getDeclaredMethods();
            System.out.println(methods.length);         //2
            //遍历Method
            for(Method method:methods){
                //获取修饰符列表
                System.out.println(Modifier.toString(method.getModifiers()));
                //获取方法的返回值类型
                System.out.println(method.getReturnType().getSimpleName());
                //获取方法名
                System.out.println(method.getName());
                //方法的参数列表(一个方法的参数可能有多个)
                Class[] parameterTypes=method.getParameterTypes();
                for(Class parameterType:parameterTypes){
                    System.out.println(parameterType.getSimpleName());
                }
            }
    
        }}

    9. Der Reflexionsmechanismus ruft den Konstruktor auf



    10. Holen Sie sich die übergeordnete Klasse und die übergeordnete Schnittstelle

    • Verwandte kostenlose Lernempfehlungen:
    • Java-Grundlagen

    Das obige ist der detaillierte Inhalt vonJava führt das Erhalten von Klasseninformationen durch Reflektion ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

  • Stellungnahme:
    Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen