java反射

欲钱看码报是什么意思:java反射

码报开奖结果本期 www.iwqgw.icu JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

一般情況下,我們不應該在正常編程中使用反射,因為存在以下缺點:

  1. 性能低-因為java反射動態地解析類型,它涉及處理像掃描類路徑找到要加載的類,導致性能降低。

  2. 安全限制-反射需要運行時權限,可能不適用于在安全管理器下運行的系統。這可能會導致應用程序在運行時由于安全管理器而失敗。

  3. 安全問題-使用反射,我們可以訪問我們不應該訪問的部分代碼,例如,我們可以訪問類的私有字段并更改它的值。這可能是一個嚴重的安全威脅,并導致您的應用程序的行為異常。

  4. 高維護-反射代碼很難理解和調試,在編譯時也無法找到代碼的任何問題,因為類可能不可用,使得它不太靈活和難以維護。

 

API簡介
— java.lang.Class; 代表一個類

  — java.lang.reflect.Constructor; 代表類的構造方法

  — java.lang.reflect.Field; 代表類的成員變量(成員變量也稱為類的屬性)

  — java.lang.reflect.Method;  代表類的方法

  — java.lang.reflect.Array;  提供了動態創建數組,以及訪問數組的元素的靜態方法

定義類

復制代碼

public interface BaseInterface {    
    public int interfaceInt=0;    
    void method1();    
    int method2(String str);
}

復制代碼

復制代碼

public class BaseClass {    public int baseInt;    
    private static void method3(){
        System.out.println("Method3");
    }    
    public int method4(){
        System.out.println("Method4");        return 0;
    }    
    public static int method5(){
        System.out.println("Method5");        return 0;
    }    
    void method6(){
        System.out.println("Method6");
    }    
    // inner public class
    public class BaseClassInnerClass{}        
    //member public enum
    public enum BaseClassMemberEnum{}
}

復制代碼

復制代碼

@Deprecatedpublic class ConcreteClass extends BaseClass implements BaseInterface {    public int publicInt;    private String privateString="private string";    protected boolean protectedBoolean;
    Object defaultObject;    
    public ConcreteClass(int i){        this.publicInt=i;
    }

    @Override    public void method1() {
        System.out.println("Method1 impl.");
    }

    @Override    public int method2(String str) {
        System.out.println("Method2 impl.");        return 0;
    }
    
    @Override    public int method4(){
        System.out.println("Method4 overriden.");        return 0;
    }    
    public int method5(int i){
        System.out.println("Method4 overriden.");        return 0;
    }    
    // inner classes
    public class ConcreteClassPublicClass{}    private class ConcreteClassPrivateClass{}    protected class ConcreteClassProtectedClass{}    class ConcreteClassDefaultClass{}    
    //member enum
    enum ConcreteClassDefaultEnum{}    public enum ConcreteClassPublicEnum{}    
    //member interface
    public interface ConcreteClassPublicInterface{}

}

復制代碼

 

獲取類對象

可以使用三個方法來獲得對象的Class - 通過靜態變量類,使用對象的getClass()方法和java.lang.Class.forName(String fullyClassifiedClassName)。

1)、使用Class類的forName(String className)靜態方法。改方法需要傳入字符串參數,改字符串參數的值是某個類的全限定類名(必須添加完整的包名)。

Class.forName("java.lang.String");

2)、調用某個類的class屬性來獲取該類對應的class對象

String.class

3)、調用某個對象的getClass方法。

String s = "aa";
Class<?> clazz = s.getClass();

對于基本類型和數組,我們可以使用靜態變量類。包裝器類提供另一個靜態變量TYPE來獲取類。

復制代碼

// Get Class using reflectionClass<?> concreteClass = ConcreteClass.class;
concreteClass = new ConcreteClass(5).getClass();try {    // below method is used most of the times in frameworks like JUnit    //Spring dependency injection, Tomcat web container    //Eclipse auto completion of method names, hibernate, Struts2 etc.    //because ConcreteClass is not available at compile time
    concreteClass = Class.forName("com.journaldev.reflection.ConcreteClass");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
System.out.println(concreteClass.getCanonicalName()); // prints com.journaldev.reflection.ConcreteClass//for primitive types, wrapper classes and arraysClass<?> booleanClass = boolean.class;
System.out.println(booleanClass.getCanonicalName()); // prints booleanClass<?> cDouble = Double.TYPE;
System.out.println(cDouble.getCanonicalName()); // prints doubleClass<?> cDoubleArray = Class.forName("[D");
System.out.println(cDoubleArray.getCanonicalName()); //prints double[]Class<?> twoDStringArray = String[][].class;
System.out.println(twoDStringArray.getCanonicalName()); // prints java.lang.String[][]

復制代碼

獲取Super Class

如果此類表示Object類,接口,原始類型或void,則getSuperclass() 返回null。

Class<?> superClass = Class.forName("com.journaldev.reflection.ConcreteClass").getSuperclass();
System.out.println(superClass); // prints "class com.journaldev.reflection.BaseClass"System.out.println(Object.class.getSuperclass()); // prints "null"System.out.println(String[][].class.getSuperclass());// prints "class java.lang.Object"

獲取Declared類

getDeclaredClasses()方法返回一個Class對象數組,反射所有被聲明為由此Class對象表示的類的成員的類和接口。返回的數組不包括在繼承的類和接口中聲明的類。

復制代碼

//getting all of the classes, interfaces, and enums that are explicitly declared in ConcreteClassClass<?>[] explicitClasses = Class.forName("com.journaldev.reflection.ConcreteClass").getDeclaredClasses();//prints [class com.journaldev.reflection.ConcreteClass$ConcreteClassDefaultClass, 
//class com.journaldev.reflection.ConcreteClass$ConcreteClassDefaultEnum, 
//class com.journaldev.reflection.ConcreteClass$ConcreteClassPrivateClass, 
//class com.journaldev.reflection.ConcreteClass$ConcreteClassProtectedClass, 
//class com.journaldev.reflection.ConcreteClass$ConcreteClassPublicClass, 
//class com.journaldev.reflection.ConcreteClass$ConcreteClassPublicEnum, 
//interface com.journaldev.reflection.ConcreteClass$ConcreteClassPublicInterface]System.out.println(Arrays.toString(explicitClasses));

復制代碼

獲取Package名字

//prints "com.journaldev.reflection"System.out.println(Class.forName("com.journaldev.reflection.BaseInterface").getPackage().getName());

獲取類的Modifiers

System.out.println(Modifier.toString(concreteClass.getModifiers())); //prints "public"//prints "public abstract interface"System.out.println(Modifier.toString(Class.forName("com.journaldev.reflection.BaseInterface").getModifiers()));

獲取Type Parameters

//Get Type parameters (generics)TypeVariable<?>[] typeParameters = Class.forName("java.util.HashMap").getTypeParameters();for(TypeVariable<?> t : typeParameters)
System.out.print(t.getName()+",");

獲取Implemented Interfaces

Type[] interfaces = Class.forName("java.util.HashMap").getGenericInterfaces();//prints "[java.util.Map<K, V>, interface java.lang.Cloneable, interface java.io.Serializable]"System.out.println(Arrays.toString(interfaces));//prints "[interface java.util.Map, interface java.lang.Cloneable, interface java.io.Serializable]"System.out.println(Arrays.toString(Class.forName("java.util.HashMap").getInterfaces()));

獲取所有的public Methods

getMethods()方法返回類的公共方法數組,包括它的超類和超級接口的公共方法。

Method[] publicMethods = Class.forName("com.journaldev.reflection.ConcreteClass").getMethods();//prints public methods of ConcreteClass, BaseClass, ObjectSystem.out.println(Arrays.toString(publicMethods));

獲取所有public Constructors

//Get All public constructorsConstructor<?>[] publicConstructors = Class.forName("com.journaldev.reflection.ConcreteClass").getConstructors();//prints public constructors of ConcreteClassSystem.out.println(Arrays.toString(publicConstructors));

獲取所有public Fields

getFields()方法返回類的公共字段數組,包括它的超級類和超級接口的公共字段。

//Get All public fieldsField[] publicFields = Class.forName("com.journaldev.reflection.ConcreteClass").getFields();//prints public fields of ConcreteClass, it's superclass and super interfacesSystem.out.println(Arrays.toString(publicFields));

獲取所有Annotations

java.lang.annotation.Annotation[] annotations = Class.forName("com.journaldev.reflection.ConcreteClass").getAnnotations();//prints [@java.lang.Deprecated()]System.out.println(Arrays.toString(annotations));

獲取指定的Public Field

 getField() 方法在指定的類引用中查找字段,然后在超級接口中,然后在超類中。

Field field = Class.forName("com.journaldev.reflection.ConcreteClass").getField("interfaceInt");

通過屬性獲取類

復制代碼

try {
    Field field = Class.forName("com.journaldev.reflection.ConcreteClass").getField("interfaceInt");
    Class<?> fieldClass = field.getDeclaringClass();
    System.out.println(fieldClass.getCanonicalName()); //prints com.journaldev.reflection.BaseInterface} catch (NoSuchFieldException | SecurityException e) {
    e.printStackTrace();
}

復制代碼

獲取Field Type

Field field = Class.forName("com.journaldev.reflection.ConcreteClass").getField("publicInt");
Class<?> fieldType = field.getType();
System.out.println(fieldType.getCanonicalName()); //prints int

Get/Set Public Field Value

Field field = Class.forName("com.journaldev.reflection.ConcreteClass").getField("publicInt");
ConcreteClass obj = new ConcreteClass(5);
System.out.println(field.get(obj)); //prints 5field.setInt(obj, 10); //setting field value to 10 in objectSystem.out.println(field.get(obj)); //prints 10

獲取指定的Public Method

復制代碼

Method method = Class.forName("java.util.HashMap").getMethod("put", Object.class, Object.class);//get method parameter types, prints "[class java.lang.Object, class java.lang.Object]"System.out.println(Arrays.toString(method.getParameterTypes()));//get method return type, return "class java.lang.Object", class reference for voidSystem.out.println(method.getReturnType());//get method modifiersSystem.out.println(Modifier.toString(method.getModifiers())); //prints "public"

復制代碼

調用Public Method

如果方法是靜態的,我們可以傳遞NULL作為對象參數。

Method method = Class.forName("java.util.HashMap").getMethod("put", Object.class, Object.class);
Map<String, String> hm = new HashMap<>();
method.invoke(hm, "key", "value");
System.out.println(hm); // prints {key=value}

調用Private Methods

//invoking private methodMethod method = Class.forName("com.journaldev.reflection.BaseClass").getDeclaredMethod("method3", null);
method.setAccessible(true);
method.invoke(null, null); //prints "Method3"

獲取指定的Public Constructor

Constructor<?> constructor = Class.forName("com.journaldev.reflection.ConcreteClass").getConstructor(int.class);//getting constructor parametersSystem.out.println(Arrays.toString(constructor.getParameterTypes())); // prints "[int]"
        Constructor<?> hashMapConstructor = Class.forName("java.util.HashMap").getConstructor(null);
System.out.println(Arrays.toString(hashMapConstructor.getParameterTypes())); // prints "[]"

實例化對象使用Constructor

復制代碼

Constructor<?> constructor = Class.forName("com.journaldev.reflection.ConcreteClass").getConstructor(int.class);//getting constructor parametersSystem.out.println(Arrays.toString(constructor.getParameterTypes())); // prints "[int]"
        Object myObj = constructor.newInstance(10);
Method myObjMethod = myObj.getClass().getMethod("method1", null);
myObjMethod.invoke(myObj, null); //prints "Method1 impl."Constructor<?> hashMapConstructor = Class.forName("java.util.HashMap").getConstructor(null);
System.out.println(Arrays.toString(hashMapConstructor.getParameterTypes())); // prints "[]"HashMap<String,String> myMap = (HashMap<String,String>) hashMapConstructor.newInstance(null);

復制代碼


上一篇: java十宗罪

下一篇: Java——永存、曲折、低谷、重生!

分享到: 更多
抢庄牌九网站 香港马会综合资枓大全2019 彩神计划软件破解版赚钱 老款非凡炸金花在哪下 重庆时时彩必中规律 炸金花技巧规律视频 牛牛看4张牌抢庄老是输 pk10冠军4码计划 打水果老虎机技巧规律 万赢棋牌抢庄看牌牛牛 网赌输50万又赢回来了 彩票助赢软件怎么下载 深圳11选五5开奖结果 三公怎么玩法介绍 双色球30期走势表 吉林快三彩票