Class<Student> clazz = Student.class; // 访问Student类的class属性
Student stu = new Student(); Class<Student> clazz = stu.getClass(); // 调用Student对象的getName方法
有哪些方式能够提升反射效率?php
// 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
如何防止反射序列化***单例git
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文件:github
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; }
经过反射得到泛型的实际类型参数面试
例子:segmentfault
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