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. Oracle INTERVAL DAY TO SECOND数据类型

    INTERVAL DAY TO SECOND数据类型 Oracle语法: INTERVAL '{ integer | integer time_expr | time_expr }' { { DAY ...

  2. 前端--关于CSS文本

    文本是网页中最重要的一种内容形式,文本几乎可以写在任何地方,块级元素中可以写行内元素中也可以写.文本都是由一个个字符组成的 ,在css布局中,每一个字符都有一个em框,通常font-size设置的大小 ...

  3. iOS nav加角标

    写一个类别加上就可以啦 #import "UIBarButtonItem+Badge.h" #import "BadgeView.h" #import < ...

  4. Js之Location对象

    Window对象的location属性引用的是Location对象,它表示该窗口中当前显示的文档的URL,并定义了方法来使窗口载入新的文档.Document对象的location属性也引用到Locat ...

  5. python运维开发(十九)----Django后台表单验证、session、cookie、model操作

    内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...

  6. oc语言--内存管理

    一.基本原理 1.什么是内存管理 1> 移动设备的内存及其有限,每个app所能占用的内存是有限制的 2> 当app所占用的内存较多时,系统就会发出内存警告,这是需要回收一些不需要的内存空间 ...

  7. Node.js how to respond to an upgrade request?

    You just need to call socket.write with the appropriate HTTP syntax as plain text along these lines ...

  8. Azure上A/D系列虚拟机到DS系列迁移(1)

    有一些用户在刚开始的时候创建了A7,D14等虚拟机来跑一些IO要求比较高的应用,比如Oracle数据库,MySQL数据库,等到用户量上来之后,性能不够,需要升级数据磁盘到SSD固态硬盘,但是问题是: ...

  9. js刷新页面

    reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页 ...

  10. C++之------虚函数

    今天又是周日,公司工业区这里九月份每个周日都会停电一天.停电停网,是没法活的.我们直接去老大家. 老大当爸爸了,回家一段时间了.听说孩子出生就不乖,很折腾他爸妈,这小家伙新生命二代.也愿小家伙早日康复 ...