Java-反射


得到代表的字节码的Class,Class类用于表示.class文件(字节码)

什么是反射?

  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
  • 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

简单来说 java的反射机制是指在程序运行过程中动态的获取一个类或对象的成员属性及方法。利用一个类来获取我们需要的对象的构造方法,成员变量,成员方法。

一:Class类的获取

Class类的获取有三种方法

package com.demo;

public class Student {

}

1.使用对象的getClass()方法来获取Class对象

Student student = new Student();
        Class class1 = student.getClass();

2.任何一个类都有一个隐含的静态成员变量Class,通过该静态成员获取Class对象

Class class2 = Student.class;

3.使用Class类的静态方法forName()

    try{
            Class class3 = Class.forName("com.demo.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

因为该方法传入的时一个字符串形式的类路径,所以通过该方法获取的Class对象时需要处理ClassNotFoundException异常,该异常代表找不到类或者无法加载。

4.小结(获取的三个Class类的比较)

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

public class Main {
    public static void main(String[] agrs){
        //使用对象的getClass()方法来获取Class对象
        Student student = new Student();
        Class class1 = student.getClass();
        //通过隐含的静态成员变量获取Class对象
        Class class2 = Student.class;
        //使用Class类的静态方法forName()
        try{
            Class class3 = Class.forName("com.demo.Student");
            System.out.println(class2 == class3);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(class1 == class2);
    }
}

true
true

二:获取构造方法的信息

package com.demo;

public class Student {
    //默认构造方法
    Student(String str){
        System.out.println("无参构造方法");
    }

    //无参构造方法
    public Student(){
        System.out.println("无参构造方法");
    }

    //一个参数的构造方法
    public Student(String name,int age){
        System.out.println("名字:" + name +" " + "年龄" + age);
    }

    //私有构造方法
    private Student(char sax){
        System.out.println("性别:" + sax);
    }

}

package com.demo;
import org.w3c.dom.ls.LSOutput;

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

public class Main {
    public static void main(String[] agrs)throws Exception{
        Class clazz = Class.forName("com.demo.Student");
        System.out.println("-----------------------------获取公有构造方法------------------------------");
        Constructor[] constructors = clazz.getConstructors();
        for(Constructor c:constructors){
            System.out.println(c);
        }
        System.out.println("-----------------------------获取所有构造方法------------------------------");
        constructors = clazz.getDeclaredConstructors();
        for (Constructor c:constructors) {
            System.out.println(c);
        }
        System.out.println("----------------------------获取公有构造方法并调用---------------------------");
        Constructor constructor = clazz.getConstructor();//获取需要的对象的构造方法
        System.out.println(constructor);
        Object objdect = constructor.newInstance(null);//实例化对象,获取无参构造方法并调用

        constructor = clazz.getConstructor(String.class,int.class);
        System.out.println(constructor);
        objdect = constructor.newInstance("张三",13);//实例化对象,获取含参数的构造方法并调用
        System.out.println("----------------------------获取私有构造方法并调用---------------------------");
        constructor = clazz.getDeclaredConstructor(char.class);
        constructor.setAccessible(true);//暴力访问(忽略掉访问修饰符)
        System.out.println(constructor);
        objdect = constructor.newInstance('男');
    }
}

-----------------------------获取公有构造方法------------------------------
public com.demo.Student(java.lang.String,int)
public com.demo.Student()
-----------------------------获取所有构造方法------------------------------
private com.demo.Student(char)
public com.demo.Student(java.lang.String,int)
public com.demo.Student()
com.demo.Student(java.lang.String)
----------------------------获取公有构造方法并调用---------------------------
public com.demo.Student()
无参构造方法
public com.demo.Student(java.lang.String,int)
名字:张三 年龄13
----------------------------获取私有构造方法并调用---------------------------
private com.demo.Student(char)
性别:

三:获取成员变量的信息

package com.demo;

public class Student {
    public String name;
    public int age;
    private char sax;
}
package com.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] agrs)throws Exception{
        Class clazz = Class.forName("com.demo.Student");
        System.out.println("----------------------------获取公有的成员变量的字段---------------------------");
        Field[] fields = clazz.getFields();
        for(Field F:fields){
            System.out.println(F);
        }
        System.out.println("----------------------------获取所有的成员变量的字段---------------------------");
        fields = clazz.getDeclaredFields();
        for(Field F:fields){
            System.out.println(F);
        }
        System.out.println("----------------------------获取私有的成员变量信息---------------------------");
        Field field = clazz.getDeclaredField("sax");
        field.setAccessible(true);
        System.out.println(field);
        System.out.println(field.getName());//返回Field对象表示的字段名称
        Object object = clazz.newInstance();
        field.set(object,'J');
        System.out.println(field.get(object));

    }
}


----------------------------获取公有的成员变量的字段---------------------------
----------------------------获取公有的成员变量的字段---------------------------
public java.lang.String com.demo.Student.name
public int com.demo.Student.age
----------------------------获取所有的成员变量的字段---------------------------
public java.lang.String com.demo.Student.name
public int com.demo.Student.age
private char com.demo.Student.sax
----------------------------获取私有的成员变量信息---------------------------
private char com.demo.Student.sax
sax
J

四:获取成员方法的信息

package com.demo;

public class Student {
    public String name;
    public int age;
    private char sax;
    public String printName(String name){
        System.out.println("名字" + name);
        return "abce";
    }
    private void printAge(int age){
        System.out.println("年龄:" + age);
    }
}

package com.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] agrs)throws Exception{
        Class clazz = Class.forName("com.demo.Student");
        System.out.println("----------------------------获取公有的成员方法---------------------------");
        Method[] methods = clazz.getMethods();
        for (Method M:methods) {
            System.out.println(M);
        }
        System.out.println("----------------------------获取所有的成员变量---------------------------");
        Method[] methods1 = clazz.getDeclaredMethods();
        for (Method M:methods1) {
            System.out.println(M);
        }
        System.out.println("----------------------------获取私有的成员变量信息---------------------------");
        Method method = clazz.getDeclaredMethod("printAge",int.class);
        method.setAccessible(true);
        System.out.println(method);
        Class c = method.getReturnType();//返回Method对象所表示的类型
        System.out.println(c);
        Object object = clazz.newInstance();
        System.out.println(method.invoke(object,15));
    }
}

----------------------------获取公有的成员方法---------------------------
public java.lang.String com.demo.Student.printName(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
----------------------------获取所有的成员变量---------------------------
public java.lang.String com.demo.Student.printName(java.lang.String)
private void com.demo.Student.printAge(int)
----------------------------获取私有的成员变量信息---------------------------
private void com.demo.Student.printAge(int)
void
年龄:15
null
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值