获取Class类的四种方法
/** 第一种反射方式 */
Class clazz1 = new Cat().getClass(); //这种方式通过Object的getClass()方法获取Class
/** 第二种反射方式 */
Class clazz2 = Cat.class;
/** 第三种反射方式 */
// 先声明 xxx 类所在包的完整名
String className = "com.test.Cat";
Class clazz3 = Class.forName(className); //通过Class的静态方法forName()获取该类的对象
/** 第四种反射方式 */
//通过Class类获取类加载器然后通过类加载器ClassLoader的loadClass()的返回该类的对象
Class clazz4 = this.getClass().getClassLoader().loadClass(className);
获取类中的变量,并进行赋值
@Test
public void test() throws Exception {
Class clazz = Cat.class;
//通过Class的newInstance()获取该实例对象
/***
可能出现的异常
IllegalAccessException - 如果类或其nullary构造函数不可访问。
InstantiationException -
1.这个类表示抽象类,接口,数组类,原语类型或void;
2.类没有空值构造函数;
3.或者由于某种其他原因,实例化失败。
ExceptionInInitializerError - 如果由此方法引发的初始化失败。
****/
Cat cat = (Cat) clazz.newInstance();
/** 声明为 public 类型的变量可以这样获取 **/
//先通过Class的getField("成员变量名")获取到指定的属性对象实例
Field field1 = clazz.getField("catNo");
//通过属性实例对象给创建的实例的对应属性设置值
field1.set(cat, "01");//这里就是拿到了Cat类中的catNo属性变量,然后给cat实例设置值
System.out.println(student);
/** 其他类型变量只能通过如下获取 **/
Field field2 = clazz.getDeclaredField("catName");
field2.setAccessible(true);
field2.set(cat, "小三");
System.out.println(student);
}