java中反射的机制

什么反射

什么是反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
通俗来讲就是通过class文件对象,去使用文件中的成员变量,成员方法和构造方法。
反射就是通过类来获取类里面的方法和属性。所以说首先我们需要来解剖一个类,而解剖一个类我们需要获取该类的字节码对象,也就是.class文件对象,一个类在编译的时候都会产生一个.class对象

怎么样获取该类的字节码对象

在这里我们有三种去获取字节码对象
(1)person p=new person();
Class c= p.getclass();
Object类中的getclass方法
(2)
Class c= person.class;
数据类型的静态属性class
(3)Class c=Class.forName("cn.zll.test.person");
class类中的静态方法

package cn.zll.test;
public class person {
    private String name;
    private int age;
    private String address;
    public String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "person [address=" + address + ", age=" + age + ", id=" + id
                + ", name=" + name + "]";
    }
    public person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }
    public person(){
        super();
    }
    private person(String name){
        super();
        this.name=name;
    }
    public person(String name,int age){
        super();
        this.name=name;
        this.age=age;
    }
    public void show(){

        System.out.println("show");

    }
    private void fun(){
        System.out.println("private");

    }
    public void eat(String str){

        System.out.println(str);

    }

}

package cn.zll.test;

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

public class test {

public static void main(String[] args) throws 
ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, 
IllegalAccessException, InvocationTargetException, NoSuchFieldException {
    //获取字节码文件对象

// Class c=Class.forName(“cn.zll.test.person”);
//获取构造方法(分为几种形式)
//获取所有公共的构造方法
// Constructor[] cons= c.getConstructors();
// for (Constructor constructor : cons) {
//
// System.out.println(constructor);
// public cn.zll.test.person()
// public cn.zll.test.person(java.lang.String,int,java.lang.String)
// }
// //获取所有的构造方法
// Constructor[] Declaredcon=c.getDeclaredConstructors();
// for (Constructor constructor : Declaredcon) {

// System.out.println(constructor);
// public cn.zll.test.person()
// public cn.zll.test.person(java.lang.String,int,java.lang.String)
// private cn.zll.test.person(java.lang.String)

// }
// 一般我们经常用的是某一个构造方法而不是全部,获取单个的构造方法,参数也是class类型,是根据参数的不同来调用不能的构造方法
// 返回的是公共无参构造方法对象,
// Constructor con=c.getConstructor();
// 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
// 他的作用相当于person p= new person()
// Object obj= con.newInstance();
// System.out.println(obj);

// 获取有参公共的构造方法
// Constructor con=c.getConstructor(String.class,int.class);
// Object obj= con.newInstance(“xx”,90);
// System.out.println(obj);
// person [address=null, age=90, name=xx]

// 获取有参私有构造方法
// IllegalAccessException:非法访问
// Constructor con=c.getDeclaredConstructor(String.class);
// 设置为true表示的取消java语言检查功能
// con.setAccessible(true);
// Object obj= con.newInstance(“xx”);
// System.out.println(obj);

    person p=new person();
    //Class c=p.getClass();
    Class c= person.class;
    System.out.println(c);


    //反射成员变量并且使用
    //获取.class的对象
    //Class c=Class.forName("cn.zll.test.person");
    //获取所有的变量

// Field[] f= c.getFields();
// for (Field field : f) {
// System.out.println(field);
// public java.lang.String cn.zll.test.person.id
// }

    //获取私有变量

// Field [] fs=c.getDeclaredFields();
// for (Field field : fs) {
// System.out.println(field);
// private java.lang.String cn.zll.test.person.name
// private int cn.zll.test.person.age
// private java.lang.String cn.zll.test.person.address
// }
//获取某一个公有变量 ,获取filed对象
// Field field = c.getField(“id”);
//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例
Constructor con=c.getConstructor();
Object obj= con.newInstance();
//将指定对象变量上此field对象表示的字段设置为指定的值。
//给obj对象上的address字段设置的值为广东省
// field.set(obj, “123”);
// System.out.println(obj);
// person [address=null, age=0, id=123, name=null]

    //获取某一个私有变量

// Field field=c.getDeclaredField(“address”);
// field.setAccessible(true);
// field.set(obj, “广东”);
// System.out.println(obj);
//person [address=广东, age=0, id=null, name=null]

    //通过反射获取成员方法
    //获取自己和父类的公有方法

// Method[] method= c.getMethods();
// for (Method method2 : method) {

// System.out.println(method2);
// public java.lang.String cn.zll.test.person.getAddress()
// public java.lang.String cn.zll.test.person.toString()
// public java.lang.String cn.zll.test.person.getName()
// public java.lang.String cn.zll.test.person.getId()
// public void cn.zll.test.person.setName(java.lang.String)
// public void cn.zll.test.person.setId(java.lang.String)
// public int cn.zll.test.person.getAge()
// public void cn.zll.test.person.setAge(int)
// public void cn.zll.test.person.setAddress(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 native int java.lang.Object.hashCode()
// public final native java.lang.Class java.lang.Object.getClass()
// public boolean java.lang.Object.equals(java.lang.Object)
// public final native void java.lang.Object.notify()
// public final native void java.lang.Object.notifyAll()

// }
//获取自己的公共方法
// Method[] method =c.getDeclaredMethods();
// for (Method method2 : method) {

// System.out.println(method2);
// public java.lang.String cn.zll.test.person.getAddress()
// public java.lang.String cn.zll.test.person.toString()
// public java.lang.String cn.zll.test.person.getName()
// public java.lang.String cn.zll.test.person.getId()
// public void cn.zll.test.person.setName(java.lang.String)
// public void cn.zll.test.person.setId(java.lang.String)
// public int cn.zll.test.person.getAge()
// public void cn.zll.test.person.setAge(int)
// public void cn.zll.test.person.setAddress(java.lang.String)
// }
//获取自己的某一个方法
//无参方法
// Method method= c.getMethod(“show”);
// method.invoke(obj);
// System.out.println();
//有参方法
// Method method=c.getMethod(“eat”, String.class);
// method.invoke(obj, “猫吃鱼”);
//猫吃鱼

    //获取私有方法

// Method method=c.getDeclaredMethod(“fun”);
// method.setAccessible(true);
// method.invoke(obj);
}

}

“`

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值