(1)object.getClass()和Object.class的区别
两者的区别如下:
类名.class叫做“类字面量”,因class是关键字, 所以类名.class编译时确定。而getclass()是某个具体的方法来调用,是运行时根据实际实例确定,getClass()是动态而且是final的。
例如:
String.class 是能对类名的引用取得在内存中该类型class对象的引用,而new String().getClass() 是通过实例对象取得在内存中该实际类型class对象的引用。
我们可以使用一个小例子来看两者的不同:
1.抽象类
package com.kang;
public abstract class Animal {
}
2.实例类
package com.kang;
public class Dog extends Animal {
public static void main(String[] args) {
Animal animal = new Dog();
System.out.println(animal.getClass().getName());
//输出com.kang.Dog
System.out.println(Animal.class.getName());
//输出com.kang.Animal
}
}
3.结果
com.kang.Dog
com.kang.Animal
1
2
4.解释
animal.getClass().getName()是在程序运行时获得运行时实例的类类型。而Animal.class.getName()是在编译阶段就确定了的,与运行时的状态无关。
(2)获取class 三种方式
通过反射越过泛型检查
(2)注解 加 反射
2.1 元注解
三 反射实战
@org.junit.Test
public void textRefleact(){
Person person = new Person("wjf","18");
Class aClass = person.getClass();
Field[] fields = aClass.getDeclaredFields();
try {
String value = (String) aClass.getDeclaredMethod("getAge").invoke(person);
System.out.println(value);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} finally {
}
for (int i = 0; i <fields.length ; i++) {
Field field = fields[i];
field.setAccessible(true);
System.out.println(field);
System.out.println(field.getName());
try {
System.out.println((String)field.get(person));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
运行结果