java中的反射
java中的反射
获取类的class对象
package com.han.reflection;
/**
* 获取类的class对象
*/
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException{
Class c1 = Class.forName("com.han.reflection.User");
System.out.println(c1.hashCode());//1163157884
Class c2 = Class.forName("com.han.reflection.User");
Class c3 = Class.forName("com.han.reflection.User");
Class c4 = Class.forName("com.han.reflection.User");
System.out.println(c2.hashCode());//1163157884
System.out.println(c3.hashCode());//1163157884
System.out.println(c4.hashCode());//1163157884
}
}
class User{
private String name;
private int age;
public User(){
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
获得class的几种方式
package com.han.reflection;
/**
* 获得class对象的几种方式
*/
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException{
Person p = new Student();
System.out.println("这个人是:"+p.name);//这个人是:Student
//获取Class实例的一些方法
//通过对象获得
Class c1 = p.getClass();
System.out.println(c1);//class com.han.reflection.Student
//通过包名加类名获得,forName
Class c2 = Class.forName("com.han.reflection.Student");
System.out.println(c2);//class com.han.reflection.Student
//通过对象名获得
Class c3 = Student.class;
System.out.println(c3);//class com.han.reflection.Student
//一些包装类有一些内置对象
Class<Integer> c4 = Integer.TYPE;
System.out.println(c4);//int
//获得父类的Class
Class c5 = c1.getSuperclass();
System.out.println(c5);//class com.han.reflection.Person
}
}
class Person{
public String name;
public Person(){
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Student extends Person{
public Student(){
this.name = "Student";
}
}
class Teacher extends Person{
public Teacher(){
this.name = "Teacher";
}
}
所有类型的class
package com.han.reflection;
import java.lang.annotation.ElementType;
/**
* 所有类型的class
*/
public class Test03 {
public static void main(String[] args) {
Class c1 = Object.class;//对象 class java.lang.Object
Class c2 = Comparable.class;//接口 interface java.lang.Comparable
Class c3 = ElementType.class;//枚举 class java.lang.annotation.ElementType
Class c4 = String[].class;//一维数组 class [Ljava.lang.String;
Class c5 = int[][].class;//二维数组 class [[I
Class c6 = Override.class;//注解 interface java.lang.Override
Class c7 = Integer.class;//包装类 class java.lang.Integer
Class c8 = String.class;//class java.lang.String
Class c9 = void.class;//void
Class c10 = Class.class;//class java.lang.Class
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
System.out.println(c9);
System.out.println(c10);
//只要元素类型和纬度一样,就是同一个class
int [] a = new int[10];
int [] b = new int[20];
System.out.println(a.getClass().hashCode());//1163157884
System.out.println(b.getClass().hashCode());//1163157884
/**
* 运行结果
* class java.lang.Object
* interface java.lang.Comparable
* class java.lang.annotation.ElementType
* class [Ljava.lang.String;
* class [[I
* interface java.lang.Override
* class java.lang.Integer
* class java.lang.String
* void
* class java.lang.Class
* 1163157884
* 1163157884
*/
}
}