1.1.2):当一个class被加载,或当加载器(class loader)的definaClass()被JVM调用,JVM便自动产生一个Class对象
1.1.3):Class类是Reflection的根源
针对任何你想动态加载、运行的类,唯有先获得相应的Class对象
1.2 反射机制的常见作用
1.2.1):动态加载类、动态获取类的信息(属性、方法、构造器)
1.2.2):动态构造对象
1.2.3):动态调用类和对象的任意方法、构造器
1.2.4):动态调用和处理属性
1.2.5):获取泛型信息
1.2.6):处理注解
1.3 Class类的对象如何获取?
1.3.1):运用 getClass()
1.3.2):运用Class.forName()(最常被使用)
1.3.3):运用 .class语法
测试各种类型(class、interface、enum、annotaion,primitive type void void) 测试java.lang.Class对应的获取方式
package com.lyy.test;
/**
-
测试各种类型(class、interface、enum、annotaion,primitive type void void) 测试java.lang.Class对应的获取方式
-
@author lyy
*/
@SuppressWarnings(“all”)
public class Demo1 {
public static void main(String[] args) {
try {
String path = “com.lyy.test.bean.User”;
Class<?> cls = Class.forName(path);
//对象用来表示或封装一些数据 一个类加载后,JVM会创建一个对应该类的class对象,类的机构信息会放到对应的class对象中
//class对象就像一面镜子一样,通过这面镜子可以看到对应的全部信息
Class<?> clss = Class.forName(path);
System.out.println(cls.hashCode());//一个类只对应一个Class对象
System.out.println(clss.hashCode());
Class strcls = String.class;
Class strclass = path.getClass();
System.out.println(strcls.equals(strclass));
Class incls = int.class;
int[] arr1 = new int[10];
int[][] arr2 = new int[30][3];
int[] arr3 = new int[30];
double[] arr4 = new double[10];
System.out.println(arr1.getClass().hashCode());
System.out.println(arr2.getClass().hashCode());
System.out.println(arr3.getClass().hashCode());
System.out.println(arr4.getClass().hashCode());
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.lyy.test.bean;
public class User {
private int id;
private int age;
private String uname;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public void setUname() {
this.uname = “lyy”;
}
public User(int id, int age, String uname) {
super();
this.id = id;
this.age = age;
this.uname = uname;
}
//javabean必须要有无参构造方法
public User() {
super();
}
}
应用反射API,获取类的信息(类的名字、属性、方法、构造器等)
package com.lyy.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
-
应用反射API,获取类的信息(类的名字、属性、方法、构造器等)
-
@author lyy
*/
public class Demo2 {
public static void main(String[] args) {
String path = “com.lyy.test.bean.User”;
try {
Class<?> cls = Class.forName(path);
//获取类的名字
System.out.println(cls.getName());//获得包名+类名
System.out.println(cls.getSimpleName());// 类名 User
//获取属性信息
// Field[] field = cls.getFields(); //只能获取public下的field
Field[] field = cls.getDeclaredFields();//获取所有的field
Field f = cls.getDeclaredField(“uname”);
System.out.println(field.length);
for (Field temp : field) {
System.out.println(“属性:”+temp);
}
//获取方法信息
Method[] method = cls.getDeclaredMethods();
Method method1= cls.getDeclaredMethod(“getUname”,null);
//如果方法有参数,则必须传递参数类型对应的Class对象</