标签:年龄 访问权限 gets ESS efault ted 变量 tco 类对象
java反射概念
在java运行时环境,对于任意一个类,能够获取它的属性和方法,对于任意一个对象,能够获取调用它的方法和属性,这种动态获取类的信息以及动态调用对象的方法的功能称为java反射机制。
java反射机制主要提供了以下功能:
java反射的作用
java反射最大的作用就是开发各种通用框架,spring就是最典型的例子;利用反射,我们可以通过配置文件来动态加载配置和加载类;
java反射常用类
java.lang.class: 类对象 java.lang.reflect.Contructor: 类的构造器 java.lang.reflect.Field: 类的成员变量(属性) java.lang.reflect.Method: 类的方法
常用的一些方法
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修饰的属性或方法。
标签:年龄 访问权限 gets ESS efault ted 变量 tco 类对象
原文地址:https://www.cnblogs.com/bigfirecloud/p/11431042.html