反射机制

  指可以在运动时加载、探知、使用编译期间完全未知的类

  程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够获取这个类的属性和方法;对于任意一个对象可以调用它的任意一个方法和属性。

  加载完类之后,在堆内存中,就产生一个Class类型的对象(一个类只有一个Class对象),这个对象包含了完整的类的结构信息。我们可以通过这个对象看到类的结构,包括类的属性、类的方法、类的构造函数。

Class类介绍

  java.lang.Class类十分特殊,用来表示Java中的类型(class/interface/enum/annotation/primitive type/void)本身

  Class对象包含了某个被加载的类的结构。一个被加载的类对应一个Class对象

  Class类是反射的根源,如果想动态加载运行的类,必须先获得相应的Class对象

Class类的对象如何获取

  1. 运用getClass()

    Student s = new Student();
    s.getClass();
  2. 运用Class.forName() (最常用的方法)

    Class<Student> object = (Class<Student>) Class.forName(className);
  3. 运用.class语法

    Class instance = Student.class;

反射的常见操作

  1、动态加载类、动态获取类的信息(属性、方法、构造器)

  新建一个Student的类

package com.parry.guava.reflection;

public class Student {

    private String id;

    private String name;

    private int age;

    public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Student(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
} public Student() {
super();
} @Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
} }

Student

  测试动态获取类的属性、方法、构造器

public class TestReflection {

    private final static String className = "com.parry.guava.reflection.Student";

    public static void main(String[] args) throws Exception {
Class<Student> object = (Class<Student>) Class.forName(className); // 获得包名+类名
System.out.println("全类名:" + object.getName());
// 获得类名
System.out.println("类名" + object.getSimpleName()); // 只能获取public类型的属性
Field[] fields1 = object.getFields();
for (Field f : fields1) {
System.out.println(f);
}
// 获取所有类型的属性
Field[] fields2 = object.getDeclaredFields();
for (Field f : fields2) {
System.out.println("类的属性:" + f);
}
// 获取指定的任意类型的属性
Field field1 = object.getDeclaredField("age");
System.out.println("Point:"+field1);
// 获取指定的公有的属性
// Field field2 = object.getField("age");
// System.out.println("Point:"+field2); // 获取无参构造函数
Constructor<Student> constructor1 = object.getConstructor(null);
System.out.println("无参构造函数:" + constructor1);
//获取含参构造函数
Constructor<Student> constructor2 = object.getConstructor(String.class, String.class, int.class);
System.out.println("含参构造函数:" + constructor2); // 获取公有的方法
Method[] methods1 = object.getMethods();
for(Method method:methods1){
System.out.println("公有的方法:"+ method);
}
// 获取所有的方法
Method[] methods2 = object.getMethods();
for(Method method:methods2){
System.out.println("所有的方法:"+ method);
}
// 获取指定方法名的方法
}
}

  2、动态构建对象

    private final static String className = "com.parry.guava.reflection.Student";

    public static void main(String[] args) throws Exception {
Class<Student> object = (Class<Student>) Class.forName(className);
//通过调用反射API调用构造方法,构建对象
Student student = object.newInstance(); //其实就是调用了Student的无参构造方法(所以必须保证Student这个JavaBean有无参构造函数)
System.out.println(student);
}

  3、动态调用类和对象的方法和构造器

  (1)动态调用构造器

    private final static String className = "com.parry.guava.reflection.Student";

    public static void main(String[] args) throws Exception {
Class<Student> object = (Class<Student>) Class.forName(className);
Constructor<Student> c = object.getConstructor(String.class,String.class,int.class);
Student s = c.newInstance("1001","parry",18);
System.out.println(s);
}

  (2)动态调用对象的方法

    private final static String className = "com.parry.guava.reflection.Student";

    public static void main(String[] args) throws Exception {
Class<Student> object = (Class<Student>) Class.forName(className);
Student student = object.newInstance();
//通过反射API调用普通方法
Method method = object.getDeclaredMethod("setName", String.class);
method.invoke(student, "yang");
System.out.println(student);
}

  4、动态调用和处理属性

    private final static String className = "com.parry.guava.reflection.Student";

    public static void main(String[] args) throws Exception {
Class<Student> object = (Class<Student>) Class.forName(className);
Student student = object.newInstance();
//通过反射API操作属性
Field field = object.getDeclaredField("name");
//由于该属性是private,需要声明该属性不做安全检查,直接访问
field.setAccessible(true);
field.set(student, "parry");
System.out.println(student);
}

  

  

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

  1. Java - 反射机制(Reflection)

    Java - 反射机制(Reflection)     > Reflection 是被视为 动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的       ...

  2. Java反射机制Reflection

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

  3. Java中的反射机制Reflection

    目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...

  4. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  5. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  6. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  7. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  8. Java的反射机制Reflect

    简介: 动态获取类的信息.动态调用对象的方法的功能叫做:Java 的反射(Reflection)机制. Reflection是不同于C++等静态语言,而被视为准动态语言的关键性质.反射机制允许程序在运 ...

  9. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  10. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

随机推荐

  1. KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  2. [c] base64

    / * Program: * base64 encode & decode * Author: * brant-ruan * Date: * 2016-02-29 * Usage: * Enc ...

  3. Eclipse里面代码上下文变量点击后不一起变色

    使用eclipse的时候,点击变量发现该类里面的变量颜色不变,经百度得知这个功能没有打开,下面打开方法: 1.使用“Alt+Shift+O”对该提示功能的开/关切换2.可以在以下设置选中后的文本提示颜 ...

  4. Svn Patch 中文乱码

    关于Patch svn打patch的介绍:巧用svn create patch(打补丁)方案解决定制版需求 svn创建patch 1.在SVN的提交列表中,右键选择“创建补丁” 2.选择保存位置,保存 ...

  5. PagerHelper-分页类

    2016.01.29   public static class PagerHelper { #region 数字分页类 /// <summary> /// /// </summar ...

  6. js删除数据的几种方法

    js 删除数组几种方法 var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为u ...

  7. 用 C# 轻松读取、改变文件的创建、修改、访问时间

    创建时间是文件存入到电脑中的时间,而修改时间则是改变起内容的最后时间 // 读取文件的创建.修改.访问时间FileInfo fi = new FileInfo("C://test.txt&q ...

  8. h1/title,b/strong,i/em 的区别

    < strong > 表示html页面上的强调(emphasized text), < em > 表示句子中的强调(即强调语义) 1.b和strong的区别 盲人朋友使用阅读设 ...

  9. 带OUTPUT参数的CLR存储过程

    前面写了一篇<带参数的CLR存储过程>http://www.cnblogs.com/insus/p/4373605.html ,如果我们需要创建一个带OUTPUT返回值. 实现它,可以先了 ...

  10. Windows 8 开发系列汇总

    Windows 8 应用开发 Windows 8 应用开发 - 异步调用 Windows 8 应用开发 - 本地数据存储 Windows 8 应用开发 - 挂起与恢复 Windows 8 应用开发 - ...