Java - 反射机制(Reflection)
    > Reflection 是被视为 动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的
       内部信息,并能直接操作任意对象的内部属性及方法
 
> Java 反射机制提供的功能
    > 在运行时判断任意一个对象所属的类
    > 在运行时构造任意一个类的对象
    > 在运行时判断任意一个类所具有的成员变量和方法
    > 在运行时调用任意一个对象的成员变量和方法
    > 生成动态代理
 
> 代码示例:
public class TestReflection {
 //关于类的加载器:ClassLoader
 @Test
 public void test5() throws Exception{
  ClassLoader loader1 = ClassLoader.getSystemClassLoader();
  System.out.println(loader1);
 
  ClassLoader loader2 = loader1.getParent();
  System.out.println(loader2);
 
  ClassLoader loader3 = loader2.getParent();
  System.out.println(loader3);
 
  Class clazz1 = Person.class;
  ClassLoader loader4 = clazz1.getClassLoader();
  System.out.println(loader4);
 
  String className = "java.lang.String";
  Class clazz2 = Class.forName(className);
  ClassLoader loader5 = clazz2.getClassLoader();
  System.out.println(loader5);
 
  //掌握如下
  //法一:
  ClassLoader loader = this.getClass().getClassLoader();
  InputStream is = loader.getResourceAsStream("com\\atguigu\\java\\jdbc.properties");
  //法二:
// FileInputStream is = new FileInputStream(new File("jdbc1.properties"));
 
  Properties pros = new Properties();
  pros.load(is);
  String name = pros.getProperty("user");
  System.out.println(name);
 
  String password = pros.getProperty("password");
  System.out.println(password);
 
 }
 //如何获取Class的实例(3种)
 @Test
 public void test4() throws ClassNotFoundException{
  //1.调用运行时类本身的.class属性
  Class clazz1 = Person.class;
  System.out.println(clazz1.getName());
 
  Class clazz2 = String.class;
  System.out.println(clazz2.getName());
 
  //2.通过运行时类的对象获取
  Person p = new Person();
  Class clazz3 = p.getClass();
  System.out.println(clazz3.getName());
 
  //3.通过Class的静态方法获取.通过此方式,体会一下,反射的动态性。
  String className = "com.atguigu.java.Person";
  Class clazz4 = Class.forName(className);
// clazz4.newInstance();
  System.out.println(clazz4.getName());
 
  //4.(了解)通过类的加载器
  ClassLoader classLoader = this.getClass().getClassLoader();
  Class clazz5 = classLoader.loadClass(className);
  System.out.println(clazz5.getName());
 
  System.out.println(clazz1 == clazz3);//true
  System.out.println(clazz1 == clazz4);//true
  System.out.println(clazz1 == clazz5);//true
 }
 
 /*
  * java.lang.Class:是反射的源头。
  * 我们创建了一个类,通过编译(javac.exe),生成对应的.class文件。之后我们使用java.exe加载(JVM的类加载器完成的)
  * 此.class文件,此.class文件加载到内存以后,就是一个运行时类,存在在缓存区。那么这个运行时类本身就是一个Class的实例!
  * 1.每一个运行时类只加载一次!
  * 2.有了Class的实例以后,我们才可以进行如下的操作:
  *     1)*创建对应的运行时类的对象
  *     2)获取对应的运行时类的完整结构(属性、方法、构造器、内部类、父类、所在的包、异常、注解、...)
  *     3)*调用对应的运行时类的指定的结构(属性、方法、构造器)
  *     4)反射的应用:动态代理
  */
 @Test
 public void test3(){
  Person p = new Person();
  Class clazz = p.getClass();//通过运行时类的对象,调用其getClass(),返回其运行时类。
  System.out.println(clazz);
 }
 
 
 //有了反射,可以通过反射创建一个类的对象,并调用其中的结构
 @Test
 public void test2() throws Exception{
  Class clazz = Person.class;
 
// Class clazz1 = String.class;
 
  //1.创建clazz对应的运行时类Person类的对象
  Person p = (Person)clazz.newInstance();
  System.out.println(p);
  //2.通过反射调用运行时类的指定的属性
  //2.1
  Field f1 = clazz.getField("name");
  f1.set(p,"LiuDeHua");
  System.out.println(p);
  //2.2
  Field f2 = clazz.getDeclaredField("age");
  f2.setAccessible(true);
  f2.set(p, 20);
  System.out.println(p);
 
  //3.通过反射调用运行时类的指定的方法
  Method m1 = clazz.getMethod("show");
  m1.invoke(p);
 
  Method m2 = clazz.getMethod("display",String.class);
  m2.invoke(p,"CHN");
 
 }
 
 //在有反射以前,如何创建一个类的对象,并调用其中的方法、属性
 @Test
 public void test1(){
  Person p = new Person();
// Person p1 = new Person();
  p.setAge(10);
  p.setName("TangWei");
  System.out.println(p);
  p.show();
// p.display("HK");
 }
}

Java - 反射机制(Reflection)的更多相关文章

  1. Java反射机制Reflection

    Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...

  2. java反射机制--reflection

    反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍:    Reflection is ...

  3. Java反射机制(Reflection)

    Java反射机制(Reflection) 一.反射机制是什么 Java反射机制是程序在运行过程中,对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性,这种 ...

  4. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  5. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  6. 反射——Java反射机制

    反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能 ...

  7. Java反射机制详解

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  8. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  9. Java反射机制深入研究

    ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”.   在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? ...

随机推荐

  1. .net 基础之截取字符串

    在实际开发中有时难免会遇到需要获取某个字符串中的某些字符串,这里我们可以用到字符串截取的办法. 截取字符串的方法很容易(暂不包含中文字符串),只要稍微有点.net基础的人看了都能看懂. /// < ...

  2. iOS开发 ~应用程序设计理念:视图控制器(UIViewController)、视图(UIView)

    应用程序设计理念:视图控制器(UIViewController).视图(UIView) 利用视图控制器(底层)管理视图(外观),一对一 1.视图的作用:负责显示的外观 2.视图控制器的作用:创建界面. ...

  3. (原)Ubuntu16 中安装torch版的cudnn

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5668471.html 参考网址: https://devtalk.nvidia.com/default ...

  4. (原)ippicvmt.lib(ippinit.obj) : error LNK2005: _ippSetCpuFeatures@8 已经在 ippcoremt.lib(ippinit.obj) 中定义

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5497234.html 参考网址: http://answers.opencv.org/question ...

  5. php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

    1.函数     php内置函数可以直接使用,如果没有安装php扩展即可     自定义函数 //函数function 函数名 function dump($var = null){ //支出默认参数 ...

  6. 【Solr专题之九】SolrJ教程

    一.SolrJ基础 1.相关资料 API:http://lucene.apache.org/solr/4_9_0/solr-solrj/ apache_solr_ref_guide_4.9.pdf:C ...

  7. 在 Canvas 中绘制扇形

    在 HTML5 Canvas 中,我们可以通过 arc 方法来绘制圆形: // context.arc(x, y, r, sAngle, eAngle, counterclockwise); var ...

  8. windows下配置Nginx+Mysql+Php7

    环境:Windows10 mysql-5.6.24-win32解压缩版    nginx-1.8.0    php7 1.Mysql安装 下载压缩文件之后解压缩至相应目录(我的目录是G:\wnmp\m ...

  9. scheme代码高亮

    (defun iedit-symbol-in-defun () "Enter `iedit-mode' to rename the symbol in current function, o ...

  10. Java--static interface

    http://stackoverflow.com/questions/8374646/what-is-a-static-interface-in-java http://stackoverflow.c ...