java 反射机制

博客介绍了Java反射机制,在运行状态下可获取类的所有属性和方法,包括私有部分。使用反射需先获取类对应的字节码文件对象,还给出获取类方法的代码示例,如获取公共方法和所有方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java 反射机制概论

一:通过反射机制,在运行状态时,可以获取到一个类的所有的属性和方法(包括私有的方法和属性
二:使用反射机制,需要先获取到该类对应的字节码文件对象,也就是.class文件对象
获取字节码文件对象方式该类所处阶段
Class clazz1 = Class.forName(“类名地址”);源文件阶段
Class clazz1 = Animal.class;字节码阶段
Class clazz1 = a.getClass();创建对象阶段
话不多说,直接上代码~
一:获取类的字节码文件对象

public class Animal implements AnimalInterface{
    private String sport;
    public String age;
    @Override
    public void name() {
        System.out.println("我是鹿~~");
    }
}

/**
 * @author daniel
 * @date 2019-05-02 15:12
 */
public class reflectPractice {
    public static void main(String[] args) throws ClassNotFoundException {
        Class class1=Animal.class;//字节码阶段
        Class class2= Class.forName("com.zdp.csdn.zdpcsdn.reflect.Animal");//源文件阶段
        System.out.println(class1);
        System.out.println(class2);
        Animal a=new Animal();//创建对象阶段
        Class class3= a.getClass();
        System.out.println(class3);

        //控制台输出
       /* class com.zdp.csdn.zdpcsdn.reflect.Animal
        class com.zdp.csdn.zdpcsdn.reflect.Animal
        class com.zdp.csdn.zdpcsdn.reflect.Animal*/

    }
}
二:通过无参构造方式,创建类的对象
 Class class1= Class.forName("com.zdp.csdn.zdpcsdn.reflect.Animal");
 Animal animal=(Animal)class1.newInstance();
 System.out.println(animal);
二:通过无参构造方式,需要先获取制定类的构造器方法,然后创建类的对象
 Class class1= Class.forName("com.zdp.csdn.zdpcsdn.reflect.Animal");
 //parameterTypes ,传入参数列表的类型
 Constructor constructor =class1.getConstructor(String.class,String.class);
 //传入构造方法的参数列表
 Animal animal1=(Animal)constructor.newInstance("游泳","17");
 System.out.println(animal1.getAge()+animal1.getSport());
四:获取所有的构造方法
 //获取所有的构造方法
        Constructor[]constructors=class1.getConstructors();
        for(Constructor constructor1:constructors){
            System.out.println(constructor1.getName());
            Class[] ParameterType =constructor1.getParameterTypes();
            for(int i=0;i<ParameterType.length;i++){
                //打印 构造方法对应的参数类型列表
                System.out.println(constructor1.getName()+"----"+i+ ParameterType[i].getName());
            }
        }
        
        //打印内容
       /* com.zdp.csdn.zdpcsdn.reflect.Animal
        com.zdp.csdn.zdpcsdn.reflect.Animal
        com.zdp.csdn.zdpcsdn.reflect.Animal----0java.lang.String
        com.zdp.csdn.zdpcsdn.reflect.Animal----1java.lang.String*/
五:获取类的属性值,并赋值
  //获取非私有变量的属性值,public 修饰的
        Field field=class1.getField("age");
        //获取私有属性,非 public 修饰的
        Field field1=class1.getDeclaredField("sport");
        //如果该属性是 private 修饰的 需要将该属性值设置访问权限为可操作
        field1.setAccessible(true);
        //对成员属性进行赋值操作
        field1.set(animal1,"奔跑");
        //获取该字段的属性值
        System.out.println(field1.get(animal1));
	//控制台打印内容
	//奔跑
六:获取类的所有属性,打印属性值
  //获取全部的成员变量
        Field[] fields=class1.getDeclaredFields();
        //获取成员变量的值
        for(Field field2:fields){
            //设置类的属性为可操作的权限
            field2.setAccessible(true);
            //打印属性的值
            System.out.println( field2.get(animal1));
        }
七:获取method 并使用

package com.zdp.csdn.zdpcsdn.reflect;

/**
 * @author daniel
 * @date 2019-05-02 15:17
 */
public class Animal implements AnimalInterface{
    private String sport;
    public String age;

    public Animal() {
    }

    public Animal(String sport, String age) {
        this.sport = sport;
        this.age = age;
    }

    public String getSport() {
        return sport;
    }

    public void setSport(String sport) {
        this.sport = sport;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public void name(String c,int b) {
        System.out.println("我是"+c+"今年"+b+"岁了~");
    }

    private void sex(String sex) {
        System.out.println("我是"+sex);
    }
}

  //获取非私有的方法,参数-》方法名字 方法的参数类型
        Method method=class1.getMethod("name",new Class[]{String.class,int.class});
        System.out.println(method.getName());
        //获取私有的方法,参数-》方法名字 方法的参数类型
        Method method1=class1.getDeclaredMethod("sex",String.class);
        System.out.println(method1.getName());
        //调用method方法
        Object object=method.invoke(animal1,"大象",999);
        //私有方法,需要先设置可操作权限
        method1.setAccessible(true);
        method1.invoke(animal1,"男生");
        
        //控制台打印内容
        /*
        name
        sex
        我是大象今年999岁了~
        我是男生~~
        */
八:获取所有的方法,并获取所有的方法参数列表
//获取所有的方法
        Method[]methods=class1.getDeclaredMethods();
        for(Method method2:methods){
            System.out.println(method2+"==========");
            //打开方法的可操作权限
            method2.setAccessible(true);
            //获取该方法对应的参数类型
            Class[] classes=method2.getParameterTypes();
            for(Class c:classes){
                System.out.println(c.getName());
            }
        }
          //控制台打印内容
       /* public void com.zdp.csdn.zdpcsdn.reflect.Animal.name(java.lang.String,int)==========
        java.lang.String
        int
        private void com.zdp.csdn.zdpcsdn.reflect.Animal.sex(java.lang.String)==========
        java.lang.String
        public java.lang.String com.zdp.csdn.zdpcsdn.reflect.Animal.getAge()==========
        public java.lang.String com.zdp.csdn.zdpcsdn.reflect.Animal.getSport()==========
        public void com.zdp.csdn.zdpcsdn.reflect.Animal.setSport(java.lang.String)==========
        java.lang.String
        public void com.zdp.csdn.zdpcsdn.reflect.Animal.setAge(java.lang.String)==========
        java.lang.String
                */
九:获取父类和实现的接口
         */
        //获取该类实现的所有接口
        Class[]classes=class1.getInterfaces();
        //获取该类的父类
        Class superclass=class1.getSuperclass();
        System.out.println(superclass);
        
        for(Class c:classes){
        System.out.println(c.getName());
        }

十:获取该类对应的路径

        //获取 该类的资源路径
        URL url=class1.getResource("");
        //会输出classpath的根目录
        URL url1=class1.getResource("/");
        //会输出Animal.Class所在目录
        URL url2=class1.getResource("Animal.Class");
        //Animal.Class 不在classpath根目录下,则会输出null
        URL url3=class1.getResource("/Animal.Class");
        System.out.println(url);
        System.out.println(url1);
        System.out.println(url2);
        System.out.println(url3);
        
        //打印的内容
/*
        file:/Users/daniel/workspace/zdpcsdn/target/classes/com/zdp/csdn/zdpcsdn/reflect/
        file:/Users/daniel/workspace/zdpcsdn/target/classes/ 
        file:/Users/daniel/workspace/zdpcsdn/target/classes/com/zdp/csdn/zdpcsdn/reflect/Animal.Class
        null*/

补充知识点

  • Method[] methods = c.getMethods(); // 获取自己的包括父亲的所有公共方法。
  • Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值