Heim  >  Artikel  >  Java  >  08.Java-Grundlagen – Reflexion

08.Java-Grundlagen – Reflexion

黄舟
黄舟Original
2017-02-27 10:35:231060Durchsuche


Grundlegende Konzepte


Der Java-Reflektionsmechanismus ermöglicht es uns, die Zeit während )Außer der Laufzeit (Runtime) zum Überprüfen von Klassen-, Schnittstellen-, Variablen- und Methodeninformationen.

Die Funktionen der Reflexion sind wie folgt:

  • Für jede Klasse können Sie alle Eigenschaften und Methoden dieser Klasse kennen;

  • Für jedes Objekt können Sie jede seiner Methoden und Eigenschaften aufrufen.


Klasse

Um Informationen über eine Klasse zu erhalten, müssen Sie zunächst das Klassenobjekt der Klasse abrufen.

Alle Typen in Java umfassen Basistypen (int, long, float usw.), sogar Arrays sind Klassenobjekte zugeordnet.

  • Holen Sie sich das Objekt der Klasse

//1.在编译期获取类对象Class cls = Demo.class 

//2.在运行期获取类对象(注意:需要包括完整的包名) Cllss clas = Class.forName("com.test.Demo")
  • Holen Sie sich das Name der Klasse

Class cls = ...// 1.获取完整类型(包括包名)String className = cls.getName();
// 2.获取简单类名 String simpleClassName =cls.getSimpleName();
  • Den Modifikator der Klasse abrufen

Class cls = ...// 修饰符都被包装成一个 int 类型的数字,这样每个修饰符都是一个位标识(flag bit)    
int modifiers  = cls.getModifiers();// 判断修饰符类型Modifier.isPublic( modifiers);
Modifier.isProtected( modifiers);
Modifier.isPrivate( modifiers);
Modifier.isAbstract( modifiers);
Modifier.isInterface( modifiers);
Modifier.isFinal( modifiers);
Modifier.isStatic( modifiers);
Modifier.isNative( modifiers);
Modifier.isStrict( modifiers);
Modifier.isSynchronized( modifiers);
Modifier.isTransient( modifiers);
Modifier.isVolatile( modifiers);
  • Holen Sie sich die Paketinformationen der Klasse

Class cls =...
Package p = cls.getPackage();
  • Holen Sie sich die übergeordnete Klasse, von der die Klasse erbt

Class cls = ...
Class superClass  = cls.getSuperclass();
  • Den von der Klasse implementierten Schnittstellentyp abrufen

Class cls = ...// 类可以实现多个接口,因此返回的是接口数组Class [ ] interfaces = cls.getInterfaces();

Constructor

In Java stellt die Constructor-Klasse ein Konstruktorobjekt dar.

  • Get

    PublicConstructor

Class cls = ...// 1.获取所有构造函数Constructor[] constructors = cls.getConstructors(); 

// 2.获取指定构造函数,不存在匹配则抛出异常。
// 对应的构造函数入参类为 Person(String str, int i)Constructor constructor = 
    cls.getConstructor(new Class[]{String.class,int.class});
  • Den Konstruktor-Eingabeparameter abrufen Typ

Constructor constructor = ...
// 因为构造函数的入参有多个,因此返回的数组Class [] paramterTypes = constructor.getParameterTypes();
for(Class paramterType: paramterTypes ){    
// do something...}
  • Konstruktor-Instanziierungsklasse

Class cls = ...
Constructor constructor = cls.getConstructor(new Class[]{String.class});
// Object[] 数组表示入参的具体值,需要与 Class[] 的入参类型完全匹配Demo demo = (Demo) constructor.newInstance(new Object[]{"hello"});

Field

In Java repräsentiert die Field-Klasse ein Variablenobjekt.

  • Alle Variablen abrufen (öffentlich, nicht öffentlich)

Class cls = ...// 1.获取所有公共变量Field[] fields = cls.getFields();
// 2.获取所有非公共变量Field [] privateFields =cls.getDeclaredFields();
  • Die angegebene Variable abrufen (öffentlich, nicht öffentlich)

Class cls = ...//入参为变量名称,名称不匹配则抛出异常// 获取指定公共变量Field field = cls.getField("num");
// 获取指定非公共变量Field privateField = cls.getDeclaredField("str");
  • Variable manipulieren

Class<?> cls = Demo.class;
Demo demo = (Demo) cls.newInstance();// 1.1.公共方法的 setter、getterField field = cls.getField("num");
field.set(demo, 1000);int filedValue  = (Integer) field.get(demo);// 2.1 非公共方法的 setter、getterField privateField = cls.getDeclaredField("str");
privateField.setAccessible(true); // 关键 -> 操作之前,需要设置访问权限privateField.set(demo, "hello");
String privateFieldValue = (String) privateField.get(demo);

Methode

1. Holen Sie sich das Methodenobjekt

  • Alle Methoden abrufen

Class cls = ...// 1.获取所有公共方法(包括从父类继承而来的)Method[] methods = cls.getMethods();
// 2.获取所有非公共方法(包括从父类继承而来的)Method [] privateMethods = cls.getDeclaredMethods();
  • Die angegebene Methode abrufen

Class cls = ...// 1.获取指定公共方法,入参为:方法名、方法入参Method method = cls.getMethod("print", new Class[]{String.class});
// 2.获取指定非公共方法,入参为:方法名、方法入参Method privateMethod = cls.getDeclaredMethod("say", new Class[]{int.class});
  • Den Parametertyp der Methode abrufen

Method method = ...// 1.获取方法的所有入参类型Class [] paramterTypes = method.getParameterTypes();
// 2.获取方法的返回值类型Class reeturnType = method.getReturnType();
  • Ausführen die Methode

Class cls = Demo.class;
Demo demo = (Demo) cls.newInstance();
Method method = cls.getMethod("print", new Class[]{String.class});//1.执行公用方法,入参为:类实例,方法入参的具体值method.invoke(demo, "hello");
//2.执行非公共方法Method privateMethod = 
    cls.getDeclaredMethod("print", new Class[]{String.class});
privateMethod.setAccessible(true); // 关键 -> 操作之前,需要获得访问权限privateMethod.invoke(demo, "hello");
  • Richter-Getter/Setter-Methode

public static boolean isGetter(Method method){    
if(!method.getName().startsWith("get")){        
return false;
    }    
    if(method.getParameterTypes().length !=0){        
    return false;
    }    
    if(void.class.equals(method.getReturnType())){        
    return false;
    }    
    return true;
}
public static boolean isSetter(Method method){    
if(!method.getName().startsWith("set")){        
return false;
    }    
    if(method.getParameterTypes().length !=1){        
    return false;
    }    
    return true;
}

Array

In Java wird die Array-Klasse zur Darstellung von Array-Objekten verwendet.

  • Array-Objekt abrufen

int [ ] intArray = ... 
Class arrayCls = intArray.class;
  • Array-Mitgliedstyp abrufen

Class arrayCls = ...
Class arrayComponentType =arrayCls .getComponentType();
  • Array erstellen

// 创建一个数组,类型为 int ,容量为 3int [ ] intArray = (int[]) Array.newInstance(int.class, 3);
//在 JVM 中字母I代表int类型,左边的‘[’代表我想要的是一个int类型的数组Class intArrayClass = Class.forName("[I");  

//注意‘[L’的右边是类名,类名的右边是一个‘;’符号。这个的含义是一个指定类型的数组。
 stringArrayClass = Class.forName("[Ljava.lang.String;");
  • Array-Elemente hinzufügen

int [ ] intArray = ...// 添加元素,数组为 intArray,位置为 0 ,值为 100Array.set(intArray, 0, 100);
Array.set(intArray, 1, 200);
System.out.println("intArray[0] = " + Array.get(intArray, 0));
System.out.println("intArray[1] = " + Array.get(intArray, 1));
Das Obige ist der Inhalt von 08.Java Basics - Reflection. Für weitere verwandte Inhalte achten Sie bitte auf PHP Chinesische Website (www.php.cn)!



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn