java 反射
Posted bigfirecloud
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 反射相关的知识,希望对你有一定的参考价值。
java反射概念
在java运行时环境,对于任意一个类,能够获取它的属性和方法,对于任意一个对象,能够获取调用它的方法和属性,这种动态获取类的信息以及动态调用对象的方法的功能称为java反射机制。
java反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时获取任意一个类所具有的属性和方法;
- 在运行时调用任意一个对象的方法;
java反射的作用
java反射最大的作用就是开发各种通用框架,spring就是最典型的例子;利用反射,我们可以通过配置文件来动态加载配置和加载类;
java反射常用类
java.lang.class: 类对象 java.lang.reflect.Contructor: 类的构造器 java.lang.reflect.Field: 类的成员变量(属性) java.lang.reflect.Method: 类的方法
常用的一些方法
- 测试用的bean
-
1 package test.reflect; 2 3 public class Hero 4 5 private String name; //名称 6 private Integer age; //年龄 7 private Float blood; //血量 8 private Float mana; //蓝量 9 private double speed; //速度 10 11 private String sayHello(String name,Integer age) 12 System.out.println("Hello,my name is " + name + ",I am " + age + " years old."); 13 return name; 14 15 public Hero() 16 this.name = "Logan"; 17 18 public Hero(String name,Integer age) 19 this.name = name; 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 Integer getAge() 29 return age; 30 31 public void setAge(Integer age) 32 this.age = age; 33 34 public Float getBlood() 35 return blood; 36 37 public void setBlood(Float blood) 38 this.blood = blood; 39 40 public Float getMana() 41 return mana; 42 43 public void setMana(Float mana) 44 this.mana = mana; 45 46 public double getSpeed() 47 return speed; 48 49 public void setSpeed(double speed) 50 this.speed = speed; 51 52
- 常用方法介绍和测试
-
1 try 2 Hero hero = new Hero(); 3 //获取class对象 4 Class class1 = hero.getClass(); 5 Class class2 = Hero.class; 6 Class class3 = Class.forName("test.reflect.Hero"); 7 System.out.println(class1 == class2); //true 8 System.out.println(class1 == class3); //true 9 10 //创建实例 11 Object instance1 = class1.newInstance(); //通过class对象创建 12 Constructor constructor = class1.getConstructor(); //通过构造器创建 13 Object instance2 = constructor.newInstance(); 14 15 //获取类的所有成员变量 16 Field[] fields = class1.getDeclaredFields(); 17 Float x = 0f; 18 for(int i=0; i<fields.length; i++) 19 Field field = fields[i]; 20 field.setAccessible(true); //设置该field访问权限,否则private修饰的字段无法访问 21 Type type = field.getGenericType(); //变量类型 22 if("java.lang.String".equalse(type.getTypeName())) 23 field.set(instance1,"mogan"); //给instance1对象的该字段赋值,相当于set方法 24 String value = (String)field.get(instance1); //获取值,相当于get方法 25 System.out.println(field.getName() + " = " + value); 26 27 if("java.lang.Integer".equalse(type.getTypeName())) 28 field.set(instance1,i); 29 Integer value = (Integer)field.get(instance1); 30 System.out.println(field.getName() + " = " + value); 31 32 if("java.lang.Float".equalse(type.getTypeName())) 33 field.set(instance1,x); 34 Float value = (Float)field.get(instance1); 35 x++; 36 System.out.println(field.getName() + " = " + value); 37 38 if("double".equals(type.getTypeName())) 39 field.set(instance1, 99.0); 40 double value = (Double)field.get(instance1); 41 System.out.println(field.getName() +" = " + value); 42 43 44 45 //根据变量名称获取类的某个成员变量 46 Field field = class1.getFiled("name"); 47 field.setAccessible(true); 48 field.set(instance1,"Logen"); 49 Object object = field.get(instance1); 50 System.out.println(object); 51 52 //获取该类的所有方法 53 Method[] methods = class1.getDeclaredMethods(); 54 for(int i = 0; i < methods.lenth; i++) 55 Method method = methods[i]; 56 String methodName = method.getName(); //方法名 57 System.out.printlin(methodName); 58 59 Class<?> returnType = method.getReturnType(); //方法返回值类型 60 String typeName = returnType.getName(); 61 System.out.println(typeName); 62 63 int count = method.getParametercount(); //参数个数 64 Parameter parameters = method.getParameters(); //参数 65 Class<?>[] parameterTypes = method.getParameterType(); //参数类型 66 67 68 //根据方法名称和参数类型获得具体的方法 69 Method sayHello = class1.getDeclaredMethod("sayHello",String.class,Integer.class); 70 sayHello.setAccessible(true); //获取访问权限 71 sayHello.invoke(instance1,"Logen",200); //执行方法 72 catch (ClassNotFoundException e) 73 e.printStackTrace(); 74
Class的 getDeclaredXXX和getXXX的区别:
getDeclaredXXX():得到类本身的属性或方法,不能获取继承于父类的属性和方法,可以获取到private,default,procted,public修饰的属性或方法;
getXXX():得到类本身和继承于父类的属性或方法,只能获取public修饰的属性或方法。
以上是关于java 反射的主要内容,如果未能解决你的问题,请参考以下文章