java反射机制

   java反射机制指的是在java运行过程中,对于任意的类都可以知道他的所有属性以及方法,对于任意一个对象都可以任意的调用他的属性和方法,这种动态获取对象信息和动态调用对象方法的功能称为java反射机制。 

 

image

 

反射获取类名称

package top.crosssoverjie.study;
public class Reflect {
    public static void main(String[] args) {
        Class<Reflect> c1 = Reflect.class;
        System.out.println(c1.getName());

        Reflect r1 = new Reflect() ;
        Class<Reflect> c2 = (Class<Reflect>) r1.getClass() ;
        System.out.println(c2.getName());

        try {
            Class<Reflect> c3 = (Class<Reflect>) Class.forName("top.crosssoverjie.study.Reflect");
            System.out.println(c3.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
top.crosssoverjie.study.Reflect
top.crosssoverjie.study.Reflect
top.crosssoverjie.study.Reflect

反射获取方法

package top.crosssoverjie.study;

import java.lang.reflect.Method;

public class Person {
    private String name="crossover" ;
    private String msg ;

    public Person(String name, String msg) {
        this.name = name;
        this.msg = msg;
        System.out.println(name+"的描述是"+msg);
    }

    public Person() {
        super();
    }

    public void say(String name ,String msg){
        System.out.println(name+"说:"+msg);
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }

    public static void main(String[] args) {
        try {
            //首先获取类类型
            Class c1 = Class.forName("top.crosssoverjie.study.Person") ;

            //通过newInstance()方法生成一个实例
            Object o1 = c1.newInstance() ;

            //获取该类的say方法
            Method m1 = c1.getMethod("say", String.class,String.class) ;

            //通过invoke方法调用该方法
           m1.invoke(o1, "张三","你好啊") ;

            Method[] methods = c1.getDeclaredMethods() ;
            for(Method m : methods){
                System.out.println(m.getName());
            }

            Method[] methods2 = c1.getMethods() ;
            for (Method method : methods2) {
                System.out.println(method.getName());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

反射获取属性

package top.crosssoverjie.study;

import java.io.File;
import java.lang.reflect.Field;

public class Reflect {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("top.crosssoverjie.study.Person");
            Field field = c1.getDeclaredField("name") ;
            Object o1 = c1.newInstance() ;
            /**由于Person类中的name变量是private修饰的,
            * 所以需要手动开启允许访问,是public修饰的就不需要设置了 
            **/
            field.setAccessible(true);
            Object name = field.get(o1) ;
            System.out.println(name);
        } catch (Exception e) {
            e.printStackTrace() ;
        }
    // Class<Reflect> c1 = Reflect.class;
    // System.out.println(c1.getName());
    // 
    // Reflect r1 = new Reflect() ;
    // Class<Reflect> c2 = (Class<Reflect>) r1.getClass() ;
    // System.out.println(c2.getName());
    // 
    // try {
    // Class<Reflect> c3=(Class<Reflect>)Class.forName("top.crosssoverjie.study.Reflect");
    // System.out.println(c3.getName());
    // } catch (ClassNotFoundException e) {
    // e.printStackTrace();
    // }
    }
    }

反射获取构造方法

package top.crosssoverjie.study;

import java.io.File;
import java.lang.reflect.Field;

public class Reflect {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("top.crosssoverjie.study.Person");
            Constructor dc1 = c1.getDeclaredConstructor(String.class,String.class);
            dc1.setAccessible(true);
            dc1.newInstance("小明","很帅");
        } catch (Exception e) {
            e.printStackTrace() ;
        }
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值