Reflection

反射能在运行时获取一个类的全部信息,并且可以调用类方法,修改类属性,创建类实例。

而在编译期间不用关心对象是谁

反射可用在动态代理,注解解释,和反射工厂等地方。

---------------------

  1. public class BasicTest {
  2.  
  3. public static void main(String[] args) throws Exception {
  4.  
  5. Demo demo = new Demo(10,"moss");
  6.  
  7. // 所有类的对象都是Class的实例
  8. Class<?> clazz = null;
  9. Class<?> clazz2 = null;
  10.  
  11. //获取类对象
  12. clazz = Class.forName("demos.reflection.Demo");
  13. clazz2 = Demo.class;
  14. clazz2 = demo.getClass();
  15. Q.p(clazz.getClass());
  16. Q.p(clazz==clazz2);
  17.  
  18. // 使用默认构造函数 创建一个新的实例
  19. demo = (Demo) clazz.newInstance();
  20. demo.me();
  21.  
  22. //获取所有public的构造函数
  23. Constructor<?>[] con =clazz2.getConstructors();
  24. Q.pl(con);
  25.  
  26. //使用自定义构造函数 创建一个新的实例
  27. demo=(Demo) con[1].newInstance(100,"jack");
  28. demo.me();
  29.  
  30. //获取超类 接口
  31. Q.p(clazz.getSuperclass());
  32. Q.pl(clazz.getInterfaces());
  33.  
  34. //获取所有属性,不包括继承的
  35. Field[] fields = clazz.getDeclaredFields();
  36. Q.pl(fields);
  37.  
  38. //获取无参函数,调用无参函数
  39. Method method=clazz.getMethod("me");
  40. Q.p("method "+method);
  41. method.invoke(clazz.newInstance());
  42.  
  43. //获取有参函数,调用有参函数
  44. method = clazz.getDeclaredMethod("you", int.class,String.class);
  45. Q.p("method2 "+method);
  46. method.invoke(clazz.newInstance(), 19, "you");
  47.  
  48. //获取所有方法,不包括父类的, 可通过getMethods()获取全部的
  49. Method[] methods = clazz.getDeclaredMethods();
  50. Q.pl(methods);
  51.  
  52. //给属性赋值
  53. Field field = clazz.getDeclaredField("name");
  54. field.setAccessible(true);
  55. field.set(demo, "reSetName");
  56. Q.p(demo.getName());
  57.  
  58. //获取注解
  59. method = clazz.getMethod("toString");
  60. Annotation[] as = method.getDeclaredAnnotations();
  61. Q.pl(as);
  62. }
  63. }
  1. class Father{
  2. protected String father;
  3. }
  4.  
  5. interface Interface{}
  6.  
  7. public class Demo extends Father implements Interface{
  8.  
  9. private static String k = "k";
  10.  
  11. private Integer id;
  12.  
  13. private String name;
  14.  
  15. Demo(){}
  16.  
  17. public Demo(String name){
  18. this.name=name;
  19. }
  20.  
  21. public Demo(int id, String name){
  22. this.id=id;
  23. this.name=name;
  24. }
  25.  
  26. public int getId() {
  27. return id;
  28. }
  29.  
  30. public void setId(int id) {
  31. this.id = id;
  32. }
  33.  
  34. public String getName() {
  35. return name;
  36. }
  37.  
  38. public void setName(String name) {
  39. this.name = name;
  40. }
  41.  
  42. public void me() {
  43. Q.p("["+id+"----"+name+"]");
  44. }
  45.  
  46. public void you(int id, String name){
  47. Q.p("["+id+"----"+name+"]");
  48. }
  49.  
  50. @Override
  51. public String toString(){
  52. return "["+id+"----"+name+"]";
  53. }
  54.  
  55. }

---------------------

end

Reflection的更多相关文章

  1. Fresnel Reflection - 菲涅尔反射

    [Fresnel Reflection - 菲涅尔反射] “菲涅尔”是一个人的名字,因为他发现了一个有关反射的光学现象,这个现象就用这个人的名字命名了.那么,是什么现象呢? 这就是反射/折射与视点角度 ...

  2. CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)

    CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection) 2016-08-13 由于CSh ...

  3. Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...

  4. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  5. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  6. Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c

    错误: Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, V ...

  7. 代替Reflection(反射)的一些方法

    Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...

  8. Leetcode: Line Reflection

    Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...

  9. 反射(Reflection)

    反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明: 示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息 ...

  10. 异常:“System.Reflection.Metadata”已拥有为“System.Collections.Immutable”定义的依赖项

    参考动态执行T4模板:https://msdn.microsoft.com/zh-cn/library/bb126579.aspx 我项目是.NET Framework 4.5控制台应用程序写的. 执 ...

随机推荐

  1. Android Studio 环境部署 (转载)

    Android Studio的安装和使用过程经常需要下载以来文件和Gradle版本,而Google网站在天朝的访问可谓步履维艰,没有稳定的FQ工具是非常痛苦的.何况,作为一个优秀的程序员,不能访问国外 ...

  2. oracle函数,查询,事务

    函数包括:单行函数,多行函数(分组函数) 数值函数: --绝对值 select abs(-12.3) from dual; --向上取值 select ceil(5.3) from dual; --向 ...

  3. array_sum函数 number array_sum

    数组的概念 数组就是一个用来存储一系列变量值的命名区域,每个数组元素有一个相关的索引,也成为关键字,它可以用来访问元素. PHP允许间隔性地使用数字或字符串作为数组的索引. 2.数字索引数组 2.1 ...

  4. Linux启动过程

    系统BIOS是当你点击开机键是第一个运行的程序.1. 首先主板需要接收到一个稳定的电源供给信号.如果没有得到稳定的电源供给系统自动关闭.2. 当接受到一个稳定的电源供给信号,处理器会启动,当处理器启动 ...

  5. Python的全局变量

    应该尽量避免使用全局变量.不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性.对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误.这种错误是很难 ...

  6. [基础常识]阿里云ecs从购买到环境搭建和建站!!(phpstudy一件包)

    首先如何购买ECS?发现有些人购买5G硬盘,我个人认为买硬盘应该购买20以上!这样以后好处理!   进入http://www.aliyun.com/product/ecs/?spm=5176.7189 ...

  7. 【转】Linux安装方法一(U盘引导)

    Ubuntu 13.04正式版已经在4月25日发布了,相信很多人和我一样很想安装体验一下,但是现在的Ubuntu 13.04文件已经是794M,但是很难刻录到一张CD中,所以采用U盘启动安装Ubunt ...

  8. JS写的CRC16校验算法(查表法)

    var CRC = {}; CRC._auchCRCHi = [ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0 ...

  9. angularJs自定义指令.directive==类似自定义标签

    创建自定义的指令 除了 AngularJS 内置的指令外,我们还可以创建自定义指令. 你可以使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名 ...

  10. 淘宝开放平台Session Key有效期

    各标签session时长及RefreshToken失效时长  *Refresh失效时长为0,即该sessionkey不可刷新. 标签 授权时长 Refresh失效时长 商家后台应用 固定时长1年 0 ...