反射的 获取Class类、创建对象、访问属性、调用方法

本文深入解析Java反射机制,包括如何使用反射创建对象、访问属性及调用方法。通过实例演示了不同构造方法的获取,以及如何通过反射访问各种权限级别的属性和调用带参数的方法。

创建对象种获取对象的构造方法getConstructor(),getConstructors(),getDeclaredgetConstructor(),getDeclaredConstructors()四种方法,前两者是获取的是公共的构造方法,后两者可以获取非公共的,访问属性和调用方法类似,均有getgetDeclared类似的方法。

 


准备Person类

package wxc.domain;

public class Person {

    private int id;
    private String name;
    
    public Person() {
        System.out.println("无参构造方法");
    }
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
        System.out.println("有参构造方法");
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + "]";
    }
    
    public String say(int id,String name) {
        return "我是"+id+"号选手,我的名字是"+name+",大家好!";
    }  
}

准备主方法A类

package wxc.domain;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.jar.Attributes.Name;

public class A {
    public static void main(String[] args) throws Exception {

/*1.0 获取Class类的实例三种方式 */

 

//         对象.getClass()获取


//        Person p = new Person();
//        Class clazz = p.getClass();
//        System.out.println(clazz);

 //       Class.forName("包.类") 用类的全路径获取       


//        Class clazz = Class.forName("wxc.domain.Person");
//        System.out.println(clazz);
        
//      类.class获取
//      Class clazz = Person.class;
//      System.out.println(clazz);
        


/*1.1 通过反射创建对象 */
        
//        通过无参构造方法实例化对象
        
//          Class clazz = Person.class;// 获取Class对象 
//          Person p = (Person)clazz.newInstance();//实例化Person对象    
//          System.out.println(p);
         
    
//        通过有参构造方法实例化对象   
        
//          Class clazz = Person.class;// 获取Class对象 
//          Constructor cons =  clazz.getConstructor(int.class,String.class); //获取共有的有参构造
//          Person p = (Person)cons.newInstance(1,"wxc"); //实例化Person对象
//          System.out.println(p);
         
//          Class clazz = Person.class;// 获取Class对象 
//          Constructor  cons []=  clazz.getConstructors();//获取共有的有参构造数组
//          for (Constructor c : cons) {
//            System.out.println(c);
//          }
//          Person p = (Person)cons[1].newInstance(1,"wxc");//代码的cons[1]与Person方法里面的有参数构造方法顺序有关
//          System.out.println(p);
         
/*1.2 通过反射访问属性 */
        
//        通过getDeclaredFields()获得属性
        
//        Class clazz = Person.class;//创建Class对象
//        Person p = (Person)clazz.newInstance();//实例化对象
//        
//        Field idField = clazz.getDeclaredField("id");//获取指定名称的属性
//        idField.setAccessible(true);//设置通过反射访问该属性时取消权限检查
//        idField.set(p ,1);//调用set方法给p的指定属性赋值
//        
//        Field nameField = clazz.getDeclaredField("name");    
//        nameField.setAccessible(true);//设置通过反射访问该属性时取消权限检查
//        nameField.set(p, "wxc");//调用set方法给p的指定属性赋值
//        
//        System.out.println(p);
        
//        通过getDeclaredFields()获得属性
        
//        Class clazz = Person.class;//创建Class对象
//        Person p = (Person)clazz.newInstance();//实例化对象
//        
//        Field[] fields = clazz.getDeclaredFields();//可以访问公共、默认、保护、私有。但是不包括继承
//        
//        for (Field field : fields) {  //遍历查看属性的顺序 进行依次赋值
//            System.out.println(field);
//        }
//        
//        fields[0].setAccessible(fields, true); //设置数组的是否取消全校检查
//        
//        fields[0].set(p, 1);
//        fields[1].set(p, "wxc");
//        
//        System.out.println(p);
        
        
/*1.3 通过反射调用方法 */
        
        
//        Class clazz = Person.class;
//        Person p = (Person)clazz.newInstance();
//        Method method = clazz.getMethod("say", int.class,String.class);//获取指定方法,并传入参数的Class
//        String result = (String)method.invoke(p, 1,"wxc");//调用say方法 == p.say(1 , wxc)
//        
//        System.out.println(result);
        
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值