程序员

Java反射由浅入深

2018-11-27  本文已影响0人  GGarrett

分享一下学习反射的笔记,了解反射之前要先了解一下java的class类。

1. Class类

String s = "Hello";
Runnable runnable = new Thread();
.......

一个对象的实例,赋值给一个数据类型变量的时候,严格按照数据类型来赋值。

public final class Class{
        //Class实例是JVM内部创建的
        pirvate Class () {}
}

JVM在加载Stirng类的时候,读取String.class文件,为String类创建一个Class实例,Class class = new Class(Stirng);
JVM持有的每个Class实例都指向了一个数据类型(classinterface)。


一个 Class实例包含了该 class的完整信息。
//获取一个class的Class实例

Class clas = String.class;

String s = "hello";
Class cals = s.getClass();

Class class = Class.forName("java.lang.String");
Class cla1 = String.class;

String s = "hello";
Class cal2 = s.getClass();

Class cla3 = Class.forName("java.lang.String");

boolean b1 = cls1 ==cls2; // true
boolean b1 = cls2 ==cls3; // true
Integer n = new Integer(123);

boolean b1 = n instanceof Integer ; // true
boolean b2 = n instanceof Number;  // true

boolean b3 = n.getClass() == Integer.class;// true
boolean b4 = n.getClass() == Number.class;// false
Runnable.class.isInterface(); //true
String[].class.isArray(); //true
//commons  Logging优先使用Log4j
LogFactFactory factory;
if (isClassPresent("org.apache.logging.log4j.Logger")) {
     factory = createLog4j();
} else {
     factory = createJdkLog();
}

boolean isClassPresent(String name) {
     try {
          Class.forName(name);
          return true;
     } cath (Exception e) {
          return false;             
     }
}

2. 访问字段(field)

3. 调用方法(method)

Integer n = new Integer(123);
Class cls = n.getClass();
 Method m = cls.getMethod("toString");
String s = (String) m. invoke(n);
//"123",相当于String s = n.toString();
Integer n = new Integer(123);
Class cls = n.getClass();
Method m = cls.getMethod("compareTo",Intefer.class);
int i = (Integer  ) m. invoke(n,456);//相当于int i = n.toCompareTo(456);

4. 获取继承关系

Class sup = Integer.class.getSuperclass();// Number.class
上一篇 下一篇

猜你喜欢

热点阅读