写点什么

Java 基础 26~ 反射

  • 2021 年 11 月 11 日
  • 本文字数:1705 字

    阅读完需:约 6 分钟

  • String getName() 获得方法名

  • Class getType() 获得类型

  • int getModifiers() 获得访问修饰符


创建对象,调用方法和属性




Class 类的方法:


  • Object newInstance() 创建对象,必须提供无参的构造方法

  • Method getMethod(String name,Class… paramType) 获得特定方法


name 是方法名, paramType 是参数的类型


Method 类的方法:


  • Object invoke(Object obj,Object… params) 调用方法


obj 是调用方法的对象,params 是参数的值


调用指定构造方法




Class 类的方法:


  • Constructor getContructor(Class… paramType) 获得构造方法


paramType 是构造方法的参数类型


Constructor 的方法:


  • Object newInstance(Object… params) 创建对象


params 是参数的值


反射案例




案例:运行时获得类的属性和方法信息


class Person{


private String name;


private Integer age;


public Person(){


}


public Person(String name,Integer age){


this.name = name;


this.age = age;


}


public String getName() {


return name;


}


public void setName(String name) {


this.name = name;


}


public Integer getAge() {


return age;


}


public void setAge(Integer age) {


this.age = age;


}


public void sayHi(){


System.out.println("Hi:"+name+","+age);


}


}


public class ReflectTest {


public static void main(String[] args){


try {


//获得类型


Class clazz = Person.class;


//获得所有的属性


Field[] fields = clazz.getDeclaredFields();


for(Field f : fields){


//属性名称


String name = f.getName();


//属性类型


Class c = f.getType();


System.out.println(name+" - "+c);


}


//获得所有的方法


Method[] methods = clazz.getDeclaredMethods();


for(Method m : methods){


//方法名


String name = m.getName();


//返回值类型


Class returnType = m.getReturnType();


System.out.print(returnType + " " + name + "(");


//参数


Class[] params = m.getParameterTypes();


for(Class c : params){


System.out.print(" " + c.getName());


}


System.out.println(")");


}


} catch (ClassNotFoundException e) {


e.printStackTrace();


}


}


}


案例:创建对象,调用方法


try {


//获得类型


Class clazz = Person.class;


//获得类的对象,调用默认的构造方法


Object obj = clazz.newInstance();


//获得对象的方法


Method m1 = clazz.getMethod("setName", String.class);


Method m2 = clazz.getMethod("setAge", Integer.class);


Method m3 = clazz.getMethod("sayHi");


//调用方法


m1.invoke(obj, "micheal");


m2.invoke(obj, 20);


m3.invoke(obj);


} catch (Exception e) {


e.printStackTrace();


}


案例:调用指定构造方法


try {


//运行时将 Person 类加载到内存中


Class clazz = Person.class;


//获得指定的构造方法


Constructor con = clazz.getConstructor(String.class,Integer.class);


//调用构造方法


Object obj = con.newInstance("Jim",30);


//调用方法


Method m = clazz.getMethod("sayHi");


m.invoke(obj);


} catch (Exception e) {


e.printStackTrace();


}


案例:使用反射完成 JSON 解析


public class JSONUtils{


/**


  • 解析 JSON,返回 Java 对象

  • @param json JSON 字符串

  • @param clazz Java 类型

  • @return Java 对象

  • @throws Exception


*/


public static Object fromJSON(String json,Class clazz) throws Exception {


Object obj = clazz.newInstance();


//去掉 JSON 字符串前后{}和"


json = json.replace("{", "").replace("}", "").replace(""","");


//按,分割字符串


String[] strings = json.split("\,");


for(String str : strings){


//再按:分割出属性名和属性值


String[] strs = str.split("\:");


String name = strs[0];


String value = strs[1];


//获得属性


Field field = clazz.getDeclaredField(name);


//修改属性为可以访问,因为是 private 的


field.setAccessible(true);


Object val = null;


//判断属性类型,转换值的类型


if(field.getType() == Integer.class){


val = Integer.valueOf(value);


}else{


val = value;


}


//属性赋值


field.set(obj,val);


}


//返回对象


return obj;


}


public static void main(String[] args) throws Exception {


String json = "{"name":"张三","age":"20"}";


Person person = (Person) JSONUtils.fromJSON(json,Person.class);

评论

发布
暂无评论
Java基础26~反射