您现在的位置是:首页 > 编程 > 

Java反射详解

2025-07-28 02:53:10
Java反射详解 一、概述反射——框架设计的灵魂1、框架①半成品软件;②可以在框架的基础上进行软件开发,简化代码;③使用框架不需要会反射,但自己要开发框架就需要会反射;2、反射将类的各个组成部分封装为其他对象,这就是反射机制;好处:①可以在程序运行的过程中操作这些对象;②可以解耦,提高程序的可扩展性;二、获取字节码class对象的方法1、第一阶段——Source源代码阶段Class.forame

Java反射详解

一、概述

反射——框架设计的灵魂

1、框架

①半成品软件;

②可以在框架的基础上进行软件开发,简化代码;

③使用框架不需要会反射,但自己要开发框架就需要会反射;

2、反射

将类的各个组成部分封装为其他对象,这就是反射机制;

好处:

①可以在程序运行的过程中操作这些对象;

②可以解耦,提高程序的可扩展性;

二、获取字节码class对象的方法

1、第一阶段——Source源代码阶段

Class.forame("全类名"):将字节码文件加载到内存,返回Class对象;

多用于配置文件,将类名定义在配置文件中。读取文件,加载类;

2、第二阶段——Class类对象阶段

类名.class:通过类名的属性class获取;

多用于参数的传递;

、第三阶段——Runtime运行时阶段

对象.getClass():getClass()定义在Object类中;

多用于对象获取字节码的方式;

4、代码演示

代码语言:javascript代码运行次数:0运行复制
package study.reflect;

import _references.Person;

public class Reflect {
    public static void main(String[] args) throws ClassotFoundException {
        //1、第一阶段——Source源代码阶段
        //Class.forame("全类名"):将字节码文件加载到内存,返回Class对象;
        Class c1 = Class.forame("_references.Person");
        println(c1);
        //2、第二阶段——Class类对象阶段
        //类名.class:通过类名的属性class获取;
        Class c2 = ;
        println(c2);
        //、第三阶段——Runtime运行时阶段
        //对象.getClass():getClass()定义在Object类中;
        Person person = new Person();
        Class c = person.getClass();
        println(c);
        //这三个class都是同一个
        println(c1==c2);
        println(c1==c);
        //true
        //true
    }
}
结论:

同一字节码(*.class)文件在程序执行的过程中只会被执行一次,无论通过哪种方式获取的class对象都是同一个;

三、Class对象功能概述

别忘了,先获取类,再通过类获取;

1、获取成员变量

Field[] getFields()(获取所有公共成员变量)

返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共(public修饰的)字段;

Field getField(String name)(获取指定公共成员变量)

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共(public修饰的)成员字段;

Field[] getDeclaredFields()(获取所有成员变量)

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段;

Field getDeclaredField(String name)(获取指定成员变量)

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段;

代码演示:
代码语言:javascript代码运行次数:0运行复制
package study.reflect;

import _references.Person;

import java.lang.reflect.Field;

public class GetFieldTest {
    public static void main(String[] args) throws oSuchFieldException, IllegalAccessException {
        //1、获取所有公共成员变量
        Person person = new Person();
        Class c = person.getClass();
        Field[] fields = c.getFields();
        for (Field field : fields) {
            println(field);
            //public java.lang.String _references.
        }
        //2、获取指定公共成员变量
        Field field = c.getField("name");
        println(field);
        //public java.lang.String _references.
        //、获取指定的成员变量(不关乎修饰符)
        Field field1 = c.getDeclaredField("name");
        println(field1);
        //public java.lang.String _references.
        Field field2 = c.getDeclaredField("name1");
        println(field2);
        //private java.lang.String _references.1
        //4、获取所有成员变量(不关乎修饰符)
        Field[] fields1 = c.getDeclaredFields();
        for (Field field11 : fields1) {
            println(field11);
            //private java.lang.String _references.1
            //public java.lang.String _references.
        }
        //5、对获取的变量进行操作
        //获取值
        Person p1 = new Person();
        Object value1 = field.get(p1);
        println(value1);
        //设置值
        field.set(p1,"大哥");
        Object value2 = field.get(p1);
        println(value2);//大哥
    }
}

2、获取构造方法

Ctructor<?>[] getCtructors()(获取所有公共构造方法)

返回一个包含某些 Ctructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共(public修饰的)构造方法;

Ctructor<T> getCtructor(Class<?>... parameterTypes)(获取所有指定公共构造方法)

返回一个 Ctructor 对象,它反映此 Class 对象所表示的类的指定公共(public修饰的)构造方法;

Ctructor<?>[] getDeclaredCtructors()(获取所有构造方法)

返回 Ctructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法;

Ctructor<T> getDeclaredCtructor(Class<?>... parameterTypes)(获取指定构造方法)

返回一个 Ctructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法;

代码演示:
代码语言:javascript代码运行次数:0运行复制
package study.reflect;

import _references.Person;

import java.lang.reflect.Ctructor;
import java.lang.reflect.InvocationTargetException;

public class GetCtructorsTest {
    public static void main(String[] args) throws oSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //0、获取类
        Person person = new Person();
        Class c = person.getClass();
        //1、获取所有公共构造方法
        Ctructor[] ctructors = c.getCtructors();
        for (Ctructor ctructor : ctructors) {
            println(ctructor);
            //public _references.Person(java.lang.String)
            //public _references.Person()
        }
        //2、获取所有指定公共构造方法
        Ctructor ctructor = c.getCtructor();
        println(ctructor);
        //public _references.Person(java.lang.String)
        //、获取所有构造方法
        Ctructor[] ctructors1 = c.getDeclaredCtructors();
        for (Ctructor ctructor1 : ctructors1) {
            println(ctructor1);
            //private _references.Person(java.lang.String,java.lang.String)
            //public _references.Person(java.lang.String)
            //public _references.Person()
        }
        //4、获取指定构造方法
        Ctructor ctructor1 = c.getDeclaredCtructor(,);
        println(ctructor1);
        //private _references.Person(java.lang.String,java.lang.String)
        //5、使用构造方法创建对象
        Object p1 = ("大哥");
        Person p2 = (Person)p1;
        println(p2.getame());//大哥
        p2.setame("大哥pro");
        println(p2.getame());//大哥pro
    }
}

、获取成员方法

Method[] getMethods()(获取所有公共方法,包括继承自Object的)

返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共(public修饰的) member 方法;

Method getMethod(String name, Class<?>... parameterTypes)(获取所有指定公共方法)

返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共(public修饰的)成员方法;

Method[] getDeclaredMethods()(获取所有方法,不包括继承自Object的)

返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法;

Method getDeclaredMethod(String name, Class<?>... parameterTypes)(获取指定方法)

返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法;

代码演示:
代码语言:javascript代码运行次数:0运行复制
package study.reflect;

import _references.Person;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class getMethodsTest {
    public static void main(String[] args) throws oSuchMethodException, InvocationTargetException, IllegalAccessException {
        //0、获取类
        Person person = new Person();
        Class c = person.getClass();
        //1、获取所有公共方法
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            println(method);
            //public java.lang.String _references.Person.getame()
            //public void _references.Person.setame(java.lang.String)
            //public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
            //public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
            //public final void java.lang.Object.wait() throws java.lang.InterruptedException
            //public boolean java.lang.(java.lang.Object)
            //public java.lang.String java.lang.()
            //public native int java.lang.Object.hashCode()
            //public final native java.lang.Class java.lang.Object.getClass()
            //public final native void java.lang.()
            //public final native void java.lang.All()
        }
        //2、获取所有指定公共方法
        Method method = c.getMethod("getame");
        println(method);
        //public java.lang.String _references.Person.getame()
        println("===============================");
        //、获取所有方法
        Method[] methods1 = c.getDeclaredMethods();
        for (Method method1 : methods1) {
            println(method1);
            //public java.lang.String _references.Person.getame()
            //public void _references.Person.setame(java.lang.String)
            //private java.lang.String _references.Person.getame1()
            //private void _references.Person.setame1(java.lang.String)
        }
        //4、获取指定方法
        Method method1 = c.getDeclaredMethod("getame1");
        println(method1);
        //private java.lang.String _references.Person.getame1()
        //5、调用方法
        Person p = new Person();
        //私有方法,可采用暴力反射
        method1.setAccessible(true);
        method1.invoke(p);//getame1被执行了……
    }
}

4、获取类名

String getame()

以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称;

代码演示:
代码语言:javascript代码运行次数:0运行复制
package study.reflect;

import _references.Person;

public class getameTest {
    public static void main(String[] args) {
        //0、获取类
        Person person = new Person();
        Class c = person.getClass();
        //1、获取类名
        String classame = c.getame();
        println(classame);//_references.Person
    }
}
四、案例

1、需求

写一个“框架”,在不改变类的代码的情况下,可以创建任意类,并调用其中的任意方法;

2、实现分析

配置文件+反射;

、实现步骤

①将需要创建对象的全类名和需要执行的方法定义在配置文件中;

②在程序中加载配置文件;

③使用反射技术来加载类文件进内存;

④创建对象;

⑤执行方法;

4、代码演示

学生类:
代码语言:javascript代码运行次数:0运行复制
package study.reflect;

public class Student {
    public void study(){
        println("学习啦……");
    }
    public void sleep(){
        println("睡觉啦……");
    }
}
测试类:
代码语言:javascript代码运行次数:0运行复制
package study.reflect;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class DemoTest {
    public static void main(String[] args) throws IOException, ClassotFoundException, oSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //①将需要创建对象的全类名和需要执行的方法定义在配置文件中;

        //②在程序中加载配置文件;
        //创建Properties
        Properties properties = new Properties();
        //获取类加载器
        ClassLoader classLoader = getClassLoader();
        //使用类加载器读取配置文件
        InputStream inputStream = classLoader.getResourceAsStream("pro.properties");
        //将配置文件转换为一个Properties集合
        properties.load(inputStream);
        //③使用反射技术来加载类文件进内存;
        String classame = properties.getProperty("classame");
        String methodame = properties.getProperty("methodame");
        Class c = Class.forame(classame);
        //④创建对象;
        Object o = c.getDeclaredCtructor().newInstance();
        //⑤执行方法;
        Method method = c.getMethod(methodame);
        method.invoke(o);
        //睡觉啦……
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent 删除java变量对象反射接口

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1200233.html

相关标签:无
上传时间: 2025-07-23 18:18:21
留言与评论(共有 17 条评论)
本站网友 鸡眼怎么治疗
16分钟前 发表
代码演示代码语言:javascript代码运行次数:0运行复制package study.reflect; import _references.Person; public class Reflect { public static void main(String[] args) throws ClassotFoundException { //1
本站网友 000709资金流向
21分钟前 发表
); println(ctructor1); //private _references.Person(java.lang.String
本站网友 化腾
30分钟前 发表
将类名定义在配置文件中
本站网友 中国人民银行汇率中间价
23分钟前 发表
返回Class对象; Class c1 = Class.forame("_references.Person"); println(c1); //2
本站网友 afmf
23分钟前 发表
返回Class对象; Class c1 = Class.forame("_references.Person"); println(c1); //2
本站网友 多键连发
4分钟前 发表
该对象反映此 Class 对象所表示的类或接口的指定构造方法;代码演示:代码语言:javascript代码运行次数:0运行复制package study.reflect; import _references.Person; import java.lang.reflect.Ctructor; import java.lang.reflect.InvocationTargetException; public class GetCtructorsTest { public static void main(String[] args) throws oSuchMethodException
本站网友 仙桃酒店
28分钟前 发表
基本类型或 void)名称;代码演示:代码语言:javascript代码运行次数:0运行复制package study.reflect; import _references.Person; public class getameTest { public static void main(String[] args) { //0
本站网友 水游城
5分钟前 发表
需求写一个“框架”
本站网友 无锡电影票团购
2分钟前 发表
反射将类的各个组成部分封装为其他对象
本站网友 信息网络安全
7分钟前 发表
不包括继承自Object的)返回 Method 对象的一个数组
本站网友 黄豆的功效与作用
7分钟前 发表
这些对象反映此 Class 对象表示的类或接口声明的所有方法
本站网友 易凡
1分钟前 发表
保护
本站网友 字幕文件怎么用
29分钟前 发表
IllegalAccessException { //0
本站网友 陈之平
17分钟前 发表
fields) { println(field); //public java.lang.String _references. } //2
本站网友 ezbuy
25分钟前 发表
获取所有构造方法 Ctructor[] ctructors1 = c.getDeclaredCtructors(); for (Ctructor ctructor1
本站网友 红杉国际公寓
19分钟前 发表
返回Class对象;多用于配置文件