(java)从零开始之-反射Reflect

反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用字节码对象设置对象的属性或者调用对象的方法等操作

这里记录下反射的简单使用,方便查阅

 1        /*******************
 2           获取class
 3         *******************/
 4         //Class clazz = Person.class;//方式一,通过类名获取
 5         //Class clazz = new Person().getClass();//方式二,通过对象获取
 6         Class clazz = Class.forName("reflect.Person");//方式三,通过完成限定名获取。参数为(包名+类名)。推荐使用,也是最常用
 7
 8         /*******************
 9          获取某class的构造方法
10          ******************/
11         //Constructor[] constructor = clazz.getConstructors();//获取所有共有构造方法
12         //Constructor[] constructor = clazz.getDeclaredConstructors();//获取所有构造方法
13         //Constructor constructor = clazz.getConstructor(String.class,String.class);//获取某一个构造方法(不包括私有构造方法),参数为null表示获取无参构造方法
14         Constructor constructor = clazz.getDeclaredConstructor(String.class,String.class);//获取某一个构造方法(包括私有构造方法),参数为null表示获取无参构造方法
15         /*******************
16           执行构造方法
17          ******************/
18         constructor.setAccessible(true);//如果构造方法为私有,则需改变访问修饰权限
19         Person p =(Person) constructor.newInstance("100","jiuxiangfeng1");//参数为null表示执行无参构造方法
20
21         /*******************
22          获取方法
23          ******************/
24         //Method[] method = clazz.getMethods();//获取所有共有方法
25         //Method[] method = clazz.getDeclaredMethods();//获取所有方法
26         //Method method = clazz.getMethod("setName",String.class);//获取某个方法(不包括私有方法),第二个为可变参数,如果第二个参数为null表示该方法没有参数
27         Method method = clazz.getMethod("setName",String.class);//获取某个方法(包括私有方法),第二个为可变参数,如果第二个参数为null表示该方法没有参数
28         /*******************
29          执行方法
30          ******************/
31         //method.setAccessible(true);//如果方法为私有,执行前需改变访问修饰权限,否则会引发异常
32         method.invoke(p, "jiuxiangfeng2");//第一个参数为方法执行的对象,如果是静态方法,第一个参数应为null,第二个参数为可变参数,如果第二个参数为null表示该方法没有参数
33
34         /*******************
35          获取成员变量
36          ******************/
37         //Field[] field = clazz.getFields();//获取所有公共成员变量
38         //Field[] field = clazz.getDeclaredFields();//获取所有成员变量
39         //Field field = clazz.getField("name");//获取单个公共成员变量。参数为成员变量名
40         Field field = clazz.getDeclaredField("name");//获取单个成员变量。参数为成员变量名
41         /*******************
42          设置成员变量的值
43          ******************/
44         field.setAccessible(true);//如果为私有成员变量,那么应该改变其访问修饰权限为可以访问,否则引发异常
45         field.set(p, "jiuxiangfeng3");//设置某个对象成员变量的值. 参数1为哪个对象,参数2为其成员变量的值
46         System.out.println(p);

以上代码执行都假设有一个Person.class

package reflect;
public class Person {
    public String id;
    public String name;

    public Person(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public Person() {
    }
    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;
    }
    @Override
    public String toString() {
        return this.id+"="+this.name;
    }
}
时间: 2024-10-10 21:57:03

(java)从零开始之-反射Reflect的相关文章

JAVA编程之——反射Reflect

说到反射,首先要说一下Java中的类和对象. 在Java中万事万物皆对象(有两个 例外,一个是普通数据类型,另一个是静态的东西,静态的东西不是对象的,是属于类的). 在Java中,类也是对象,类是java.lang.class类的实例对象,即所谓There is a class named Class. 以下代码说明了Java中Class类的实例对象的三种表达方式 package org.guyezhai.reflect; public class ClassDemo1 { public sta

java中【反射(Reflect)】的常见应用场景

简介: 总结于imooc课程:     http://www.imooc.com/learn/199   本文通过几个简单的例子,介绍Class类的使用,方法和成员变量的反射,以及通过反射了解集合泛型的本质等知识. 1.Class类的使用 /** * 使用java.lang.Class类动态加载一个类,编译时不对类是否存在以及对错进行检查,运行时检查 */ public class OfficeBetter { public static void main(String[] args) { a

java 反射(reflect)总结,附对象打印工具类

java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制Reflection. 这就说明:Java程序可以加载一个编译期间完全未知的class,获悉其完整构造,并生成其对象实体.或对其fields设值.或唤起其methods.虽然java并不是动态语言. 如何达到上述目的,是本文探讨的内容.本文将介绍Reflection A

Java从零开始学四十(反射简述一)

一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反射.通过反射,Java可以于运行时加载.探知和使用编译期间完全求和的类.生成其对象实体,调用其方法或者对属性设值.所以Java算是一个半动态的语言吧. 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方

Java基础——反射 reflect

a { text-decoration: none; color: inherit } * { margin: 0; padding: 0 } body { text-indent: 2rem } .on { margin: 10px 0; cursor: pointer; color: white; text-indent: 2rem } .on2 { background-color: deeppink; font: bold 24px/50px "" } .on3 { font:

Java基础之反射

Java反射是指运行时获取类信息,进而在运行时动态构造对象.调用对象方法及修改对象属性的机制.百度百科的定义:“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 一.反射的用途 Java的反射机制可以做3件事:运行时创建对象.运行时调用方法.运行时读写属性.进而实现以下功能:调用一些私有方法,实现黑科技.比如双卡短信发送.设置状态栏颜色.自动挂电

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i

java中的反射

一.什么是反射 简单来说,java反射机制其实就是I/O流的一种封装版,用来快速读取硬盘上的class文件.class文件相当于一个身份证,JVM在操作某一个对象时,需要根据身份证获得对象拥有的属性和拥有的功能及方法.这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制. 二.官方提供的反射机制API: class文件: java.lang.reflect.Class类:描述内存中class文件 属性(数据存储单位): java.lang.reflect.Field类:描述内存

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan