• 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 }
  • 相关阅读:
    自执行函数的几种不同写法的比较
    Textarea与懒惰渲染
    备忘:递归callee.caller导致死循环
    围观STK
    某台机器上IE8抛“Invalid procedure call or argument”异常
    QWrap Selector之W3C版
    onclick与listeners的执行先后问题
    随机问题之洗牌算法
    selector4 之 巧妙的主体定义符
    神奇的"javascript:"
  • 原文地址:https://www.cnblogs.com/sun1993/p/7828535.html
Copyright © 2020-2023  润新知