反射学习小结

(初学者自学总结)

学习理由:

框架底层重要的实现原理之一(反射)

反射就是在"java运行系统"时期 到"类加载器验证字节码的正确性"

  即运行期间动态的操作类加载器的字节码文件从而获得整个类文件。

1.获取一个类的class对象的方式

eg:获取Person实体类

  ①:通过.class获取:System.out.println(Person.class);

  ②:通过class对象中forName()获取:Class<?> aClass = Class.forName("deep.entity.Person");

  ③:通过类的实例获取:Person person = new Person(); System.out.println(person.getClass());

2、主要方法使用练习

  我们有一个BookEntity实体类,通过反射来加载这个类

  我封装了四个方法,分别打印类信息、属性信息、方法信息、构造器信息

 

 ①:获取类的信息:

    

 1 private static void getClassInfo(){
 2
 3      //获取class对象
 4
 5        Class<BookEntity> clazz = BookEntity.class;
 6
 7      System.out.println("类的全名称:" + clazz.getName());
 8
 9        System.out.println("类的简单类名:" + clazz.getSimpleName());
10
11      System.out.println("类的修饰符:" + Modifier.toString(clazz.getModifiers()));
12
13    }

 ②:获取类中所有属性的信息:

    

private static void getClassFieldInfo() {

    Class<BookEntity> clazz = BookEntity.class;

    Object instance = clazz.newIntance();

    Field bookNameField = clazz.getDeclareField("bookName");

    //bookName字段是私有的需要设置字段访问权限

    bookNameField.setAccessible(true);

    //调用字段对应set方法

    bookNameField.set(instance,"java");

    //获取刚刚设置到字段中的值

    Object value = bookNameField.get(instance);

    System.out.println(value);

  }

附上:set方法的源码/get方法的源码

  

 1  @CallerSensitive
 2     public void set(Object obj, Object value)
 3         throws IllegalArgumentException, IllegalAccessException
 4     {
 5         if (!override) {
 6             if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
 7                 Class<?> caller = Reflection.getCallerClass();
 8                 checkAccess(caller, clazz, obj, modifiers);
 9             }
10         }
11         getFieldAccessor(obj).set(obj, value);
12     }
 1  @CallerSensitive
 2     public Object get(Object obj)
 3         throws IllegalArgumentException, IllegalAccessException
 4     {
 5         if (!override) {
 6             if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
 7                 Class<?> caller = Reflection.getCallerClass();
 8                 checkAccess(caller, clazz, obj, modifiers);
 9             }
10         }
11         return getFieldAccessor(obj).get(obj);
12     }
13
14  

③:获取方法的所有信息:

 1 /**
 2      * 获取方法的所有信息
 3      * @throws SecurityException
 4      * @throws NoSuchMethodException
 5      * @throws IllegalAccessException
 6      * @throws InstantiationException
 7      * @throws InvocationTargetException
 8      * @throws IllegalArgumentException
 9      */
10     private static void getClassForMethodInfo() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
11         // TODO Auto-generated method stub
12
13         //获取Class对象
14         Class<BookEntity> clazz = BookEntity.class;
15
16         //获取所有public修饰的方法
17         Method[] methods = clazz.getMethods();
18         for(Method method : methods){
19             System.out.println(method);
20             System.out.println("访问修饰符:" + Modifier.toString(method.getModifiers()));
21             System.out.println("返回类型名称:" + method.getReturnType().getSimpleName());
22             System.out.println("方法名称:" + method.getName());
23             System.out.println("参数类型:" + Arrays.toString(method.getParameterTypes()));
24             System.out.println("参数个数:" + method.getParameterCount() );
25             System.out.println("----------------------------------------------");
26         }
27
28         //通过反射实例化一个对象
29         BookEntity instance = clazz.newInstance();
30
31         //获取单个方法
32         Method set = clazz.getDeclaredMethod("setBookPrice",Double.class);
33         //开启方法访问权限(如果访问修饰符非public)
34         set.invoke(instance,45.7);
35
36         //再获取get方法来获取刚刚设置的值
37         Method get = clazz.getDeclaredMethod("getBookPrice");
38
39         System.out.println(get.invoke(instance));
40
41
42         //获取当前类中所有定义的方法
43         methods = clazz.getDeclaredMethods();
44         for(Method method : methods){
45             System.out.println(method);
46         }
47     }

④获取构造器信息:

 1 /**
 2      * 获取构造器信息
 3      * @throws SecurityException
 4      * @throws NoSuchMethodException
 5      * @throws InvocationTargetException
 6      * @throws IllegalArgumentException
 7      * @throws IllegalAccessException
 8      * @throws InstantiationException
 9      */
10     private static void getClassForConstructor() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
11         // TODO Auto-generated method stub
12         //获取class对象
13         Class<BookEntity> clazz = BookEntity.class;
14         //获取所有public修饰的函数
15         Constructor<?>[] constructors = clazz.getConstructors();
16
17         for(Constructor constructor : constructors){
18             System.out.println(constructor);
19         }
20
21         System.out.println("------------------------------------------");
22
23         //湖区类中所有定义的构造函数
24         constructors = clazz.getDeclaredConstructors();
25         for(Constructor constructor : constructors){
26             System.out.println(constructor);
27             System.out.println("访问修饰符:" + Modifier.toString(constructor.getModifiers()));
28             System.out.println("构造器名称:" + constructor.getName());
29             System.out.println("参数列表:" + Arrays.toString(constructor.getParameterTypes()));
30             System.out.println("----------------------------------------");
31         }
32
33         //调用指定构造函数
34         Constructor<BookEntity> constructor = clazz.getDeclaredConstructor(int.class,String.class);
35         constructor.setAccessible(true);
36         BookEntity instance = constructor.newInstance(100,"三国演义");
37         System.out.println(instance);
38         System.out.println(instance.getBookName());
39         System.out.println(instance.getBookAuthor());
40         System.out.println(instance.getBookId());
41         System.out.println(instance.getBookPrice());
42     }

运行效果:

原文地址:https://www.cnblogs.com/deepSleeping/p/9381785.html

时间: 2024-08-03 19:07:43

反射学习小结的相关文章

ShaderLab学习小结(十九)RenderToCubemap创建能反射周围环境的效果

继续用"ShaderLab学习小结(十八)cubemap"中所做的shader想要让它能对周围的环境进行反射思路就是要让它的cubemap里的内容是周围环境的映射shader不变,就要想办法进行映射,这就要用到c#代码了核心的方法是 public bool Camera.RenderToCubemap(RenderTexture cubemap) 顾名思义,这个是Camera的一个方法,渲染至cubemap返回ture则渲染成功看unity document中的说明即从这个camera

ShaderLab学习小结(六)接收点光源阴影

运行环境:Win10 x64Unity 5.5.4在"ShaderLab学习小结(五)接收平行光阴影"中,通过修改代码,让原来的shader可以接收主平行光的阴影.但是没有点光源的阴影. 在原有的pass通道下面再添加一个pass通道,用于接收点光源阴影.直接将原来的pass复制粘贴成新的pass通道,再进行一些修改即可. pass { tags{ "lightmode" = "forwardadd" } //1. blend one one /

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

git学习小结

背景:最近因为工作原因,需要将以前的代码库由bitbucket重新布置在一台服务器上,所以就学习了下git,特此记录下 在167这台机器上搭建apache,用做git server,由于以前apache都已经搭好了,所以这里只配置git server 就可以了,此处贴出配置: 服务器搭好了,来到配置中的root目录,git clone https://[email protected]/XXXX 此时,库和服务器都搭好了,用于新库测试的机器也可以从git server上克隆库了,来,我们来试试从

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

MogileFS学习小结

大纲: 一.关于MogileFS 二.常见分布式文件系统 三.MogileFS基本原理 四.MogileFS的实现 一.关于MogileFS 当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化.在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集.数据存储.数据搜索.数据共享.数据传输.数据分析.数据可视化等一系列问题. 传统存储在面对海量数据存储表现出的力不从

201671010130 2016-2017-2 《Java程序设计》第四周学习小结

第四周学习小结 本次实验巩固了上次实验分隔数并求和的题,目前这个题有两种做法,一种是不断对数10求余,余数保存在sum中,然后左移一位,直到余数为零.另一种就是将数字强制转换成一个字符串数组String s=String.valueOf(num),根据方法s.toCharArray()将字符分离出来,据"x"-"0"=x,unicode码值相减即可得x的值. 父类和子类能够看两个交集,super关键字是否能够看做一个子类和超类的接口呢? 在子类中可以增加域.增加方法

初识ASP.NET---点滴的积累---ASP.NET学习小结

差不多十多天前学习完了北大青鸟的学习视频,没想到没几天的时间就看完了XML视频和牛腩的Javascript视频.学习完了也该总结总结,理理自己的思路,消化一下自己学习到的东西. 视频中的理论知识并不是很多,以例子驱动学起来也不会他过于乏味.全部的学习内容大概的可以用下图表示. 个人感觉这套视频的体系感不是很强,每一集之间老师的串联并不是做得很好,向我等没有教材的有些小的知识无从知晓.但是不能不说这套视频确很适合初学者学习,老师讲解的也不错,从此我也算是入门. 当然要想进一步的了解ASP.NET并

Java反射学习总结

广州疯狂软件教育Java培训,iOS培训分享Class类是Reflection API中核心的类,他位于java.lang.Class列出一些常用的方法.- getName() : 获得类的完整名字- getFields() : 获得类的public类型的属性- getDeclaredFields() : 获得类的所有属性- getMethods() : 获得类的public类型的方法- getDeclaredMethods() : 获得类的所有方法- getMethod(String name