栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java反射(超详细讲解,重要)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java反射(超详细讲解,重要)

全文内容(如果没有你想找的可以在评论区留言)

1: 获取字节码文件对象的三种方式
2: 获取公有,私有方法,并调用构造方法,成员方法
3: 获取并调用私有成员变量
4: 如何为实例对象的成员变量赋值
5: 文末有一些注意

tea1类代码
class tea1{
    private String i;
    public int j;
    public tea1(){}
    public tea1(int j){
       this.j = j;
    }
    private tea1(String i,int j){
        this.j = j;
        this.i = i;
    }

    @Override
    public String toString() {
        return "tea1{" +
                "i='" + i + ''' +
                ", j=" + j +
                '}';
    }
    private void q(){
        System.out.println("调用私有成员方法");
    }
}
测试类代码
package 学习.反射;

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

public class a {
    public static void main(String[] args) throws 
    	ClassNotFoundException, NoSuchMethodException, 
    		IllegalAccessException, InvocationTargetException, 
    			InstantiationException, NoSuchFieldException {
        //获取字节码文件对象的三种方式
        //一(推荐):foeName()里面是类所在的全路径
        //idea可以右键所在类,然后点击copy,然后点击copy reference,行了
        Class tea1 = Class.forName("学习.反射.tea1");
       	//二:通过类对象获取字节码文件对象
        tea1 tea11 = new tea1();
        Class aClass = tea11.getClass();
        //三:通过类名获取字节码文件对象
        Class aClass1 = tea1.getClass();
        
        //获取无参构造器
        Constructor constructor = tea1.getConstructor();
        //获取有参构造器
        Constructor constructor1 = tea1.getConstructor(int.class);
        
        //获取私有构造器
        Constructor declaredConstructor = 
        	tea1.getDeclaredConstructor(String.class, int.class);
        //破除私有
        
        declaredConstructor.setAccessible(true);
        
        //创建对象
        //无参
        //Constructor constructor = tea1.getConstructor();
        Object o = constructor.newInstance();
        //有参
		// Constructor constructor1 = tea1.getConstructor(int.class);
        Object o1 = constructor1.newInstance(1);
         
        Object a = declaredConstructor.newInstance("a", 1);
        //获取方法
        //这是获取公有方法,tea1.getMethod("toString")其中toString是类中	的方法名
        Method toString = tea1.getMethod("toString");
        //这是获取私有方法
        Method declaredMethod = tea1.getDeclaredMethod("q");
        //破除私有,
        declaredMethod.setAccessible(true);
        //下面是调用方法
        //结构式:方法对象.invoke(实例对象)
        //反射,反着写(狗头)
        declaredMethod.invoke(o);
        //输出3个结果
        //使用反射机制调用方法
        System.out.println(toString.invoke(o));
        //直接输出就是默认调用toString
        System.out.println(o1);
        System.out.println(toString.invoke(a));
        //获取成员变量
        //获取公有变量
        Field j = tea1.getField("j");
        //输出a实例对象的j成员变量
        System.out.println(j.get(a));
        //私有成员变量
        Field i = tea1.getDeclaredField("i");
        //破除私有
        i.setAccessible(true);
        //输出a实例对象的成员变量
        //结构:变量对象名.get(实例对象名)
        //反射,反着写(狗头)
        System.out.println(i.get(a));
        //至此,获取构造方法的内容结束
        //获取成员变量
		


		//现在,获取实例对象,方法,变量都讲完了
		//讲解如何为实例对象的成员变量进行赋值
		//不知道大家现在能否看懂
		//获取私有成员变量
        Field j1 = tea1.getDeclaredField("j");
        //破除私有变量
        j1.setAccessible(true);
        //为成员变量赋值
        //j1是成员变量的实例化对象
        //o是上文创建的一个对象,我把代码粘贴过来了
        //Constructor constructor = tea1.getConstructor();
        //Object o = constructor.newInstance();
		//结构:成员变量的实例化对象.set(类的实例化对象,对应的成员变量的值)
		//400是int,原因是:
		//Field j1 = tea1.getDeclaredField("j");
		//而j在类中是int类型,一定要类型对应
        j1.set(o,400);
        //获取并输出o对象的成员变量j的值
        System.out.println(j1.get(o));
    }
}

注意:可以按照获得私有构造器,私有方法,私有对象的函数处理公有方法,这样不会在一些未知的情况下出错。
推荐大家都使用Class.forName()来获取字节码文件对象。
谢谢大家。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/631433.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号