Java反射学习总结
Posted jinjidewoniu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射学习总结相关的知识,希望对你有一定的参考价值。
1.反射对象
- 方式1
1 //ReflectInfo为自己创建的类 2 Class reflectClass1 = new ReflectInfo().getClass();
- 方式2
1 Class reflectClass2 = ReflectInfo.class;
- 方式3
1 Class reflectClass3 = Class.forName("Reflect.ReflectInfo");
2.反射函数
- 反射构造函数并调用
1 //(ReflectInfo)为自己创建的类 2 3 //获取公有构造函数 4 Class.forName("Reflect.ReflectInfo").getConstructor(); 5 //获取所有构造函数 6 Class.forName("Reflect.ReflectInfo").getDeclaredConstructors(); 7 8 //根据参数类型获取构造函数 9 Class.forName("Reflect.ReflectInfo").getConstructor(类型.class...); 10 11 //使用构造函数 12 //跳过修饰符验证 13 //Class.forName("Reflect.ReflectInfo").getConstructor(类型.class...).setAccessible(true); 14 Class.forName("Reflect.ReflectInfo").getConstructor(类型.class...).newInstance(参数...);
-
反射自定义函数并调用
1 //(ReflectInfo)为自己创建的类 2 3 //获取公有自定义函数 4 Class.forName("Reflect.ReflectInfo").getMethods(); 5 //获取所有自定义函数 6 Class.forName("Reflect.ReflectInfo").getDeclaredMethods(); 7 8 //根据参数类型获取公有自定义函数 9 Class.forName("Reflect.ReflectInfo").getMethod("函数名称",参数类型.class..); 10 //根据参数类型获取所有自定义函数 11 Class.forName("Reflect.ReflectInfo").getDeclaredMethod("函数名称",参数类型.class..); 12 13 //使用自定义函数 14 //跳过修饰符验证 15 //Class.forName("Reflect.ReflectInfo").getMethod("函数名称",参数类型.class...).setAccessible(true); 16 Class.forName("Reflect.ReflectInfo").getMethod("函数名称",参数类型.class...).invoke( 17 Class.forName("Reflect.ReflectInfo").getConstructor(构造类型.class...).newInstance(构造参数...), 参数...);
3.反射属性并调用
-
1 //(ReflectInfo)为自己创建的类 2 //获取公有字段 3 Class.forName("Reflect.ReflectInfo").getFields(); 4 //获取所有字段 5 Class.forName("Reflect.ReflectInfo").getDeclaredFields(); 6 7 //根据字段名称获取公有字段 8 Class.forName("Reflect.ReflectInfo").getField("字段名称"); 9 //根据字段名称获取所有字段 10 Class.forName("Reflect.ReflectInfo").getDeclaredField("字段名称"); 11 12 //使用 13 //跳过修饰符验证 14 //[Field].setAccessible(true); 15 Class.forName("Reflect.ReflectInfo").getField("字段名称") 16 .set( 17 Class.forName("Reflect.ReflectInfo").getConstructor(构造类型.class...).newInstance(构造参数...),[value] 18 )
4.反射的使用
- 类型的判断
1 public class ReflectMain { 2 public static void main(String[] args) { 3 System.out.println(new String("true").getClass() == String.class); 4 5 Class<?> array = new String[]{"False", "False"}.getClass(); 6 System.out.println(array); 7 System.out.println(array == String.class); 8 9 Class<?> collection = new ArrayList<String>().getClass(); 10 System.out.println(collection); 11 System.out.println(collection == array); 12 13 Class<?> _Interface = new Exception().getClass(); 14 System.out.println(_Interface); 15 16 Class<?> _generics = (Class<?>) ((ParameterizedType) new ReflectInfo().getClass() 17 .getGenericInterfaces()[0]).getActualTypeArguments()[0]; 18 System.out.println(_generics); 19 } 20 } 21 22 interface testParameterizedType<T> { 23 }; 24 class ReflectInfo implements testParameterizedType<String> { 25 };
- 通过反射越过泛型检测
1 ArrayList<String> strList = new ArrayList<>(); 2 //获取ArrayList的Class对象,反向的调用add()方法,添加数据 3 Class listClass = strList.getClass(); //得到 strList 对象的字节码 对象 4 //获取add()方法 5 Method m = listClass.getMethod("add", Object.class); 6 //调用add()方法 7 m.invoke(strList, 100);
以上是关于Java反射学习总结的主要内容,如果未能解决你的问题,请参考以下文章
Java反射学习总结五(Annotation(注解)-基础篇)