反射的原理是什么?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还有其余子类,如:
反射有什么做用和应用?
为什么反射消耗性能
有什么优缺点
优势