Java反射机制涉及的类常见方法使用总结

  1 import java.lang.reflect.Constructor;
  2 import java.lang.reflect.*;
  3 
  4 /*Class:代表一个字节码文件的对象,每当有类被加载进内存,JVM就会在堆上给
  5  *        该类创建一个代表该类的对象。每个类的Class对象是的。
  6  *Class类没有构造方法,获得类对应的Class方法有3种
  7  *1.:getClass()、2.类、接口.class 、3.Class.forName("类全名");
  8  *比较推荐使用第3种方式,使用前两种方式程序扩展性不好。
  9  *
 10  *Class类中定义了许多关于获取类中信息的方法:
 11  *1.获得该类的构造方法,属性,方法、实例的方法。包含特定情况的获得
 12  *2.获得该类的父类,实现的接口,该类的类加载器,类名、包名等。
 13  *3.判断该类的具体是接口、类、内部类等
 14  *4.方法中加Declared表示可以获得本类定义的任何方法和属性
 15  *
 16  *注意:关于获得到的方法、属性、构造器的具体操作被封装在import java.lang.reflect包里面
 17  *Method:里面最常用的方法invoke(对象,可变参数列表)--调用指定的方法
 18  *Field:get/set;获取和修改属性值
 19  *Constrcutor:使用newInstance(可变参数列表)--调用指定构造方法创建类的实例
 20  *注意:私有的要调用前先去掉访问权限限制setAccssible()
 21  * */
 22 public class ReflectionWithClass {
 23 
 24     public static void main(String[] args) throws Exception {
 25         
 26         //第一种方式获得Class对象,比较麻烦,要先创建对象,再使用对象调用方法
 27         HelloKitty ht = new HelloKitty();
 28         Class clazz = ht.getClass();
 29         
 30         //第二种方式获得Class对象。使用静态的属性创建
 31         Class clazz1 = HelloKitty.class;
 32         
 33         //使用Class对象的静态方法获得Class对象
 34         Class clazz2 = Class.forName("HelloKitty");
 35         
 36         //获得该类的类加载器
 37         ClassLoader c = clazz2.getClassLoader();
 38         System.out.println(c.toString());
 39 
 40         Class clazz3 = String.class;
 41         System.out.println(clazz3.getClassLoader());
 42         
 43         //获得该类的实例
 44         Object obj = clazz2.newInstance();
 45         //获得该类的构造器---公开的,getDeclaredConstructors()--可以获得私有的
 46         Constructor[] con = clazz2.getDeclaredConstructors();
 47         for(Constructor cc:con){
 48             System.out.print(cc + " ");
 49         }
 50         
 51         //获得类的方法
 52         Method[] mm = clazz2.getDeclaredMethods();
 53         for(Method mmm:mm){
 54             System.out.print(mmm + " ");
 55         }
 56         
 57         System.out.println();
 58         //获取特定的方法
 59         Method m = clazz2.getMethod("walk",null);
 60         System.out.println(m.toString());
 61         
 62         Field[] f = clazz2.getDeclaredFields();
 63         for(Field ff:f){
 64             System.out.print(ff+ " ");
 65         }
 66         
 67         //调用指定的方法---先获取,在调用;注意私有方法先设置访问权限
 68         Method m1 = clazz2.getMethod("walk", null);
 69         System.out.println("hahahhha");
 70         m1.invoke(obj,null);
 71         
 72         //调用指定的构造方法创建类实例;先获取在调用
 73         Constructor cc = clazz2.getConstructor(int.class,String.class);
 74         Object o1 = cc.newInstance(12,"blue");
 75         
 76         //获取和修改对象的属性值
 77         Field ffs = clazz2.getDeclaredField("age");
 78         ffs.setAccessible(true);
 79         ffs.set(obj, 29);
 80         Object oo = ffs.get(obj);
 81         System.out.println(oo);
 82         
 83     }
 84 
 85 }
 86 
 87 class HelloKitty {
 88     private int age;
 89     public String color = "pink";
 90     public HelloKitty() {}
 91     
 92     
 93     public HelloKitty(int age) {
 94         this.age = age;
 95     }
 96     
 97     public HelloKitty(int age,String color) {
 98         this.age = age;
 99         this.color = color;
100         System.out.println("okokok");
101     }
102 
103     public void walk(){
104         System.out.println("hhhhhhhhhhhhh");
105     }
106     
107     public void talk(int i){
108         System.out.println(i + "----------" + age);
109     }
110 }

 

转载于:https://www.cnblogs.com/sun1993/p/7828535.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值