优缺点:
优点: 可以让代码更加灵活、为各种框架提供开箱即用的功能提供了便利
缺点: 存在安全隐患。比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)
package com.whbs.bean; public class UserBean { private Integer id; private int age; private String name; private String address; public UserBean(){ System.out.println("实例化"); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }} 2 > 反射测试 package com.whbs.test; import java.lang.reflect.Field; import java.lang.reflect.Method; import com.whbs.bean.UserBean; public class Test1 { public static void main(String[] args) throws Exception { /* * 通过反射 实列化类 方法1 */ //String classPath = "com.whbs.bean.UserBean"; //Class cla = Test1.class.getClassLoader().loadClass(classPath); //Object ob = cla.newInstance(); /* * 使用new关键字实列化类 方法2 */ UserBean bean = new UserBean(); bean.setId(100); bean.setAddress("武汉"); //得到类对象 Class userCla = (Class) bean.getClass(); /* * 得到类中的所有属性集合 */ Field[] fs = userCla.getDeclaredFields(); for(int i = 0 ; i < fs.length; i++){ Field f = fs[i]; f.setAccessible(true); //设置属性是可以访问的 Object val = f.get(bean);//得到此属性的值 System.out.println("name:"+f.getName()+"\t value = "+val); String type = f.getType().toString();//得到此属性的类型 if (type.endsWith("String")) { System.out.println(f.getType()+"\t是String"); f.set(bean,"12") ; //给属性设值 }else if(type.endsWith("int") || type.endsWith("Integer")){ System.out.println(f.getType()+"\t是int"); f.set(bean,12) ; //给属性设值 }else{ System.out.println(f.getType()+"\t"); } } /* * 得到类中的方法 */ Method[] methods = userCla.getMethods(); for(int i = 0; i < methods.length; i++){ Method method = methods[i]; if(method.getName().startsWith("get")){ System.out.print("methodName:"+method.getName()+"\t"); System.out.println("value:"+method.invoke(bean));//得到get 方法的值 } } } }
获取class对象的四种方式
1. 知道具体类的情况下可以使用:
Class alunbarClass = TargetObject.class;
2. 通过 **Class.forName()**传入类的路径获取
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
3. 通过对象实例**instance.getClass()**获取
TargetObject o = new TargetObject();Class alunbarClass2 = o.getClass();
4. 通过类加载器**xxxClassLoader.loadClass()**传入类路径获取:
Class clazz = ClassLoader.loadClass("cn.javaguide.TargetObject");// 通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一些列步骤,静态块和静态对象不会得到执行