反射机制(二)

来源:互联网 发布:url scheme windows 编辑:程序博客网 时间:2024/06/14 18:23

获取类有如下三种方法

1 通过类的class属性,如 Class clazz=Class.class;
2 通过实例对象的getClass方法,如:Class clazz=new Date().getClass();
3 通过Class.forName(),如 :Class clazz =Class.forName(“java.lang.String”);

获取对象实例

通过Class实例的newInstance(),如:String str=(String)clazz.newInstance();

Class类代表Java类,它的各个实例对象又分别对应什么?

对应着各个类在内存中的字节码,Person类的字节码 ArrayList的字节码
一个类被类加载器加载到内存中,占用一片存储空间,不同的类的字节码是不同,故在内存中的内容也是不同的。这空间用对象表示,类型是class

Constructor类
表示某个类中的一个构造方法
得到某个类的所有的构造方法:
Constructor co[]=Class.forName(“java.lang.String”).getConstructors();

得到某一个构造方法
Costructor con=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

创建实例对象
通常方式:String str=new String(new StringBuffer(“abc”));
反射方式:String str=(String)con.newInstance(new StringBuffer(“abc”));
调用获得的方法时要用到上面相同类型的实例对象

Class.newInstance()方法
String obj=(String)Class.forName(“java.lang.String”).newInstance();
该方法的内部先得到默认的构造方法,然后用该构造方法创建实例对象。

Field类
代表了某个类中的每一个成员变量
示例代码:

    ReflectPoint point = new ReflectPoint(1,7);    Field y = Class.forName(".corejava.ReflectPoint").getField("y");    System.out.println(y.get(point));    //Field x = Class.forName(".corejava.ReflectPoint").getField("x");    Field x = Class.forName(".corejava.ReflectPoint").getDeclaredField("x");    x.setAccessible(true);    System.out.println(x.get(point));

Method类
代表某个类中的一个成员方法
得到类中的某一个方法:
例子:Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”, int.class);

调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式: System.out.println(charAt.invoke(str, 1));
如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!

public class Person {      public static void main(String[] args) throws Exception {                 Class<?> clazz = Class.forName("net.xsoftlab.baike.Person");          // 调用Person类中的run方法          Method method = clazz.getMethod("run");          method.invoke(clazz.newInstance());          // Java 反射机制 - 调用某个类的方法1.          // 调用Person的Speak方法          method = clazz.getMethod("Speak", int.class, String.class);          method.invoke(clazz.newInstance(), 22, "小明");          // Java 反射机制 - 调用某个类的方法2.          // age -> 22. name -> 小明      }      public void run(){          System.out.println("调用Person类的run方法");      }      public void Speak(int age, String name){          System.out.println("调用Person类的Speak方法");          System.out.println("age -> " + age + ". name -> " + name);      }  }  

参考博客:
http://blog.sina.com.cn/s/blog_6b7d710b0102wgnb.html

原创粉丝点击