优缺点:

优点: 可以让代码更加灵活、为各种框架提供开箱即用的功能提供了便利

缺点: 存在安全隐患。比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)

Java反射得到属性的值和设置属性的值

  1. package com.whbs.bean;
  2. public class UserBean {
  3. private Integer id;
  4. private int age;
  5. private String name;
  6. private String address;
  7. public UserBean(){
  8. System.out.println("实例化");
  9. }
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public String getAddress() {
  29. return address;
  30. }
  31. public void setAddress(String address) {
  32. this.address = address;
  33. }
  34. }
  35. 2 > 反射测试
  36. package com.whbs.test;
  37. import java.lang.reflect.Field;
  38. import java.lang.reflect.Method;
  39. import com.whbs.bean.UserBean;
  40. public class Test1 {
  41. public static void main(String[] args) throws Exception {
  42. /*
  43. * 通过反射 实列化类 方法1
  44. */
  45. //String classPath = "com.whbs.bean.UserBean";
  46. //Class cla = Test1.class.getClassLoader().loadClass(classPath);
  47. //Object ob = cla.newInstance();
  48. /*
  49. * 使用new关键字实列化类 方法2
  50. */
  51. UserBean bean = new UserBean();
  52. bean.setId(100);
  53. bean.setAddress("武汉");
  54. //得到类对象
  55. Class userCla = (Class) bean.getClass();
  56. /*
  57. * 得到类中的所有属性集合
  58. */
  59. Field[] fs = userCla.getDeclaredFields();
  60. for(int i = 0 ; i < fs.length; i++){
  61. Field f = fs[i];
  62. f.setAccessible(true); //设置属性是可以访问的
  63. Object val = f.get(bean);//得到此属性的值
  64. System.out.println("name:"+f.getName()+"\t value = "+val);
  65. String type = f.getType().toString();//得到此属性的类型
  66. if (type.endsWith("String")) {
  67. System.out.println(f.getType()+"\t是String");
  68. f.set(bean,"12") ; //给属性设值
  69. }else if(type.endsWith("int") || type.endsWith("Integer")){
  70. System.out.println(f.getType()+"\t是int");
  71. f.set(bean,12) ; //给属性设值
  72. }else{
  73. System.out.println(f.getType()+"\t");
  74. }
  75. }
  76. /*
  77. * 得到类中的方法
  78. */
  79. Method[] methods = userCla.getMethods();
  80. for(int i = 0; i < methods.length; i++){
  81. Method method = methods[i];
  82. if(method.getName().startsWith("get")){
  83. System.out.print("methodName:"+method.getName()+"\t");
  84. System.out.println("value:"+method.invoke(bean));//得到get 方法的值
  85. }
  86. }
  87. }
  88. }

获取class对象的四种方式

1. 知道具体类的情况下可以使用:

  1. Class alunbarClass = TargetObject.class;

2. 通过 **Class.forName()**传入类的路径获取

  1. Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");

3. 通过对象实例**instance.getClass()**获取

  1. TargetObject o = new TargetObject();
  2. Class alunbarClass2 = o.getClass();

4. 通过类加载器**xxxClassLoader.loadClass()**传入类路径获取:

  1. Class clazz = ClassLoader.loadClass("cn.javaguide.TargetObject");
  2. // 通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一些列步骤,静态块和静态对象不会得到执行