java反射机制

什么叫反射

Java反射机制是在运行状态中
对于任意一个类(class文件),都能知道这个类的所以属性和方法;
对于任何一个对象,都能够调用它的任何一个方法和属性;
这样动态获取新的以及动态调用对象方法的功能就叫做反射
(其实就是用Class这个类对象动态的获取新的以及动态调用对象方法)

Class类对象获取的三种方式

这种反射是通过一个Class类去实现的,获取这个Class类有三种方式

  1. Object类中的getClass()方法的
  2. 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
  3. 用Class类中的静态方法forName
    注意:只有第二种方式基本类型才能获取class,第三种最常用,扩展性最好

代码示例

package cn.reflect;

class Student {
    private int age;
    private String name;
}

public class Test {

    /*
     * 方式1:
     * Object类中的getClass()方法的
     * 想要用这种方式,必须要明确具体的类,并创建对象比较麻烦
     */
    public static void getClassObject_1(){

        Student p = new Student();
        Class clazz = p.getClass();
        System.out.println(clazz.getName());
    }

    /*
     * 方式二:
     * 2,任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
     * 相对简单,但是还是要明确用到类中的静态成员。
     * 还是不够扩展。
     *
     */
    public static void getClassObject_2(){

        Class clazz = Student.class;
        System.out.println(clazz.getName());
    }

    /*
     * 方式三:
     * 只要通过给定的类的 字符串名称就可以获取该类,更为扩展。
     * 可是用Class类中的静态方法forName完成。
     * 这种方式只要有名称即可,更为方便,扩展性更强。注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
     */
    public static void getClassObject_3() throws ClassNotFoundException {

        String name="cn.reflect.Student";
        Class clazz =Class.forName(name);
        System.out.println(clazz.getName());
    }
    public static void main(String[] args) throws ClassNotFoundException {
        getClassObject_3();
    }
}

Class类对象获取构造函数

package cn.reflect;

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

class Student {
    private int age;
    private String name;

    public Student(String name,int age) {
        super();
        this.age = age;
        this.name = name;
        System.out.println("Student param run..."+this.name+":"+this.age);
    }

    public Student() {
        super();
        System.out.println("Student run");
    }
}

public class Test {

    //获取无参构造函数
    public static void createNewObject() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        String strName="cn.reflect.Student";
        //获取该名称类文件,并加载进内存,并产生Class对象
        Class classObj=Class.forName(strName);
        //创建对象
        Object obj=classObj.getDeclaredConstructor().newInstance();

    }

    public static void createNewObject_2() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        String strName="cn.reflect.Student";
        //获取该名称类文件,并加载进内存,并产生Class对象
        Class classObj=Class.forName(strName);
        //获取指定的构造函数对象
        Constructor constructor=classObj.getConstructor(String.class,int.class);
        //通过该构造器对象的newInstance方法进行对象的初始化
        constructor.newInstance("xiaoming",20);
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        createNewObject_2();
    }
}

Class类对象获取成员属性

代码示例

package cn.reflect;

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

class Student {
    private int age;
    public String name;

    public Student(String name,int age) {
        super();
        this.age = age;
        this.name = name;
        System.out.println("Student param run..."+this.name+":"+this.age);
    }

    public Student() {
        super();
        age=10;
        name="jack";
        System.out.println("Student run");
    }
}

public class Test {

    //获取公有的
    public static void getFieldDemo() throws Exception {
        Class classObj = Class.forName("cn.reflect.Student");
        //只能获取公有的
        Field fieldObj=classObj.getField("name");
        Object o=classObj.newInstance();
        //传入对象获取值
        Object o2 = fieldObj.get(o);
        System.out.println(o2);
    }

    //获取私有的进行暴力访问
    public static void getFieldDemo_2() throws Exception {
        Class classObj = Class.forName("cn.reflect.Student");
        //只能获取公有的
        Field fieldObj=classObj.getDeclaredField("age");
        //对私有字段的访问取消权限检查。暴力访问。
        fieldObj.setAccessible(true);
        Object o=classObj.newInstance();
        Object o2 = fieldObj.get(o);
        System.out.println(o2);
    }

    public static void main(String[] args) throws Exception {
        getFieldDemo();
        getFieldDemo_2();
    }

}

Class类对象获取成员函数

代码示例

package cn.reflect;

import com.sun.jdi.ClassObjectReference;

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

class Student {
    private int age;
    public String name;

    public Student(String name,int age) {
        super();
        this.age = age;
        this.name = name;
        System.out.println("Student param run..."+this.name+":"+this.age);
    }

    public Student() {
        super();
        age=10;
        name="jack";
        System.out.println("Student run");
    }


    public void show(){
        System.out.println(name+"...show run..."+age);
    }

    private void privateMethod(){
        System.out.println(" method run ");
    }

    public void paramMethod(String str,int num){
        System.out.println("paramMethod run....."+str+":"+num);

    }
    public static void staticMethod(){
        System.out.println(" static method run......");
    }
}

public class Test {

    //获取所有成员函数
    public static void getMethodDemo() throws Exception {
        Class classObj=Class.forName("cn.reflect.Student");
        //getMethods获取所有的公有的方法
        Method[] methodsObj=classObj.getMethods();
        //获取本类的所有方法,包括私有
        methodsObj=classObj.getDeclaredMethods();
        for (Method method:methodsObj){
            System.out.println(method);
        }
    }

    //获取无参成员函数
    public static void getMethodDemo_2() throws Exception {
        Class classObj=Class.forName("cn.reflect.Student");
        //根据方法名获取指定的public方法
        Method method=classObj.getMethod("show", null);
        //通过获取指定的构造函数来创建对象
        Constructor conObj=classObj.getConstructor(String.class,int.class);
        Object obj=conObj.newInstance("lida",30);
        //调用方法
        method.invoke(obj, null);

    }

    //获取有参成员函数
    public static void getMethodDemo_3() throws Exception {
        Class classObj=Class.forName("cn.reflect.Student");
        //根据方法名获取指定的public方法
        Method method=classObj.getMethod("paramMethod", String.class,int.class);
        Object obj=classObj.newInstance();
        //调用方法
        method.invoke(obj, "lixiaolong",32);
    }


    public static void main(String[] args) throws Exception {
        //getMethodDemo();
        //getMethodDemo_2();
        getMethodDemo_3();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值