Java反射学习总结

Posted jinjidewoniu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射学习总结相关的知识,希望对你有一定的参考价值。

1.反射对象

  1. 方式1  
    1 //ReflectInfo为自己创建的类
    2 Class reflectClass1 = new ReflectInfo().getClass(); 

     

  2. 方式2
    1 Class reflectClass2 = ReflectInfo.class;

     

      

  3. 方式3
    1 Class reflectClass3 = Class.forName("Reflect.ReflectInfo");

     

     

      

2.反射函数

  1. 反射构造函数并调用
     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(参数...);

     

     

  2. 反射自定义函数并调用

     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.  
     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. 类型的判断
     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 };

     

  2. 通过反射越过泛型检测
    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(注解)-基础篇)

JAVA反射机制—学习总结

Java学习总结(十四)——java反射机制,利用反射动态创建对象

Java反射学习总结

Java反射学习总结

Java反射学习总结