反射的原理是什麼?php
有哪些途徑獲取到Class對象,Class類的含義和做用是什麼?java
第二種方式:每一個類都會有一個名稱爲Class的靜態屬性,經過它也是能夠獲取到Class對象的,示例代碼以下:git
Class<Student> clazz = Student.class; // 訪問Student類的class屬性
第三種方式:Object類中有一個名爲getClass的成員方法,它返回的是對象的運行時類的Class對象。由於Object類是全部類的父類,因此,全部的對象均可以使用該方法獲得它運行時類的Class對象,示例代碼以下:github
Student stu = new Student(); Class<Student> clazz = stu.getClass(); // 調用Student對象的getName方法
什麼是class類?面試
有哪些方式能夠提升反射效率?segmentfault
// 1. 沒有緩存 void createInstance(String className){ return Class.forName(className).newInstance(); } // 2. 緩存forName的結果 void createInstance(String className){ cachedClass = cache.get(className); if (cachedClass == null){ cachedClass = Class.forName(className); cache.set(className, cachedClass); } return cachedClass.newInstance(); }
java反射機制提供了什麼功能?緩存
如何防止反射序列化攻擊單例安全
枚舉單例markdown
public enum Singleton { INSTANCE { @Override protected void read() { System.out.println("read"); } @Override protected void write() { System.out.println("write"); } }; protected abstract void read(); protected abstract void write(); }
class文件:app
public abstract class Singleton extends Enum{ private Singleton(String s, int i){ super(s, i); } protected abstract void read(); protected abstract void write(); public static Singleton[] values(){ Singleton asingleton[]; int i; Singleton asingleton1[]; System.arraycopy(asingleton = ENUM$VALUES, 0, asingleton1 = new Singleton[i = asingleton.length], 0, i); return asingleton1; } public static Singleton valueOf(String s) { return (Singleton)Enum.valueOf(singleton/Singleton, s); } Singleton(String s, int i, Singleton singleton){ this(s, i); } public static final Singleton INSTANCE; private static final Singleton ENUM$VALUES[]; static { INSTANCE = new Singleton("INSTANCE", 0){ protected void read(){ System.out.println("read"); } protected void write(){ System.out.println("write"); } }; ENUM$VALUES = (new Singleton[] { INSTANCE }); } }
//readResolve to prevent another instance of Singleton private Object readResolve(){ return INSTANCE; }
經過反射得到泛型的實際類型參數
例子:
public class GenericTest { public static void main(String[] args) throws Exception { getParamType(); } /*利用反射獲取方法參數的實際參數類型*/ public static void getParamType() throws NoSuchMethodException{ Method method = GenericTest.class.getMethod("applyMap",Map.class); //獲取方法的泛型參數的類型 Type[] types = method.getGenericParameterTypes(); System.out.println(types[0]); //參數化的類型 ParameterizedType pType = (ParameterizedType)types[0]; //原始類型 System.out.println(pType.getRawType()); //實際類型參數 System.out.println(pType.getActualTypeArguments()[0]); System.out.println(pType.getActualTypeArguments()[1]); } /*供測試參數類型的方法*/ public static void applyMap(Map<Integer,String> map){ } }
輸出結果:
java.util.Map<java.lang.Integer, java.lang.String> interface java.util.Map class java.lang.Integer class java.lang.String
反射獲取構造方法,變量,方法的方法是哪些?技術博客大總結
getGenericParameterTypes 與 getParameterTypes區別?
前者返回的是Type類型,後者返回的是Class類型,因爲Type頂級接口,Class也實現了該接口,所以Class類是Type的子類,Type 表示的所有類型而每一個Class對象表示一個具體類型的實例,如String.class僅表明String類型。由此看來Type與 Class 表示類型幾乎是相同的,只不過Type表示的範圍比Class要廣得多而已。固然Type還有其餘子類,如:
反射有什麼做用和應用?
爲什麼反射消耗性能
有什麼優缺點
優勢