这篇文章给大家介绍在怎么在Json中运用Java的反射与泛型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
java中的反射
首先新建一个基础类Author。
package bean;
/**
*
* @author Super~me
* Description: 基础类
*
*/
public class Author {
private static String TAG="Big";
private String name;
private int age;
public Author(){}
public Author(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Author [name=" + name + ", age=" + age + "]";
}
private String pMethod(String t){
String result=t+" Private Method";
return result;
}
}
然后新建一个反射类,运用反射方法对上面的类进行访问.包括对私有方法的访问,对私有属性的访问等。其中常用的一些方法以及解释:
//对象的创建
public static void reflectNewInstance(){
try {
Class<?> authorclass=Class.forName(path_reflectfrom);
Object object =authorclass.newInstance();
Author author=(Author) object;
author.setName("周大亨");
author.setAge(89);
System.out.println("author: "+author.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//对私有的方法进行反射
public static void reflectPrivateConstructor(){
try {
Class<?> authorclass =Class.forName(path_reflectfrom);
Constructor<?> declaredConstructor =authorclass.getDeclaredConstructor(String.class,int.class);
declaredConstructor.setAccessible(true);
Object object=declaredConstructor.newInstance("lida",88);
Author author=(Author) object;
System.out.println( "Author: "+author.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//反射私有的属性
public static void reflectPrivateField(){
try {
Class<?> authorclass =Class.forName(path_reflectfrom);
Object authorobject=authorclass.newInstance();
Field field=authorclass.getDeclaredField("TAG");
field.setAccessible(true);
String tag=(String)field.get(authorobject);
System.out.println( "private field Tag:"+tag);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//反射获取私有的方法
private static void reflectMethod(){
try {
Class<?> authorclass=Class.forName(path_reflectfrom);
Object authorobject=authorclass.newInstance();
Method authormethod=authorclass.getDeclaredMethod("pMethod", String.class);
authormethod.setAccessible(true);
String string=(String)authormethod.invoke(authorobject, TAG);
System.out.println( "private Method: "+string);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过控制台打印以上信息:查看运用结果
ReflectClass.reflectNewInstance();
ReflectClass.reflectPrivateField();
ReflectClass.reflectPrivateConstructor();
ReflectClass.reflectMethod();
运行结果:
对于泛型其实很好理解,通俗点讲就是我们将类型也当成了参数进行传值,这样做代码的安全性很大的被提升了,也为较大的优化带来可能。泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一个高的程度上验证这个类型消除了强制类型转换 使得代码可读性好,减少了很多出错的机会。但是也要记住泛型的规范,比如静态的变量和方法不能引用泛型变量,我们也不能利用instanceof等方法对泛型的类型进行判断,当然这样做也毫无意义,重要的一点是泛型类不能继承Exception或者Throwable。泛型的继承中,不论子类是否为泛型类,所继承和实现的父类接口都需要被指定。
常用的泛型类型变量:
E:元素(Element)
K:关键字(Key)
N:数字(Number)
T:类型(Type)
V:值(Value)
另外泛型界定的概念主要是指对泛型类型进行一个限定。比如:
public static <T extends String> T add(T str1, T str2) { return "";}
//利用反射获取json数据到java类
private static void getJson(){
try {
String json = "{\"name\":\"Miss王\",\"age\":79}";
JSONObject source=JSONObject.parseObject(json);
Class<?> aClass = Class.forName("bean.Author");
Object obj = aClass.newInstance();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
System.out.println(source.getString(field.getName()));
if (field.getGenericType().toString().equals(String.class.toString())) {
field.set(obj, source.getString(field.getName()));
} else if (field.getGenericType().toString().equals(int.class.toString())) {
field.set(obj, source.getInteger(field.getName()));
}
}
Author author = (Author) obj;
System.out.print(author);
} catch (Exception e) {
e.printStackTrace();
}
}
我们想把以上的实现封装起来,这时就用了泛型。
//泛型+反射实现json数据读取到java类
public static <T> T getJsonClass(String json, Class<T> beanclass) {
try {
JSONObject jsonObject = JSONObject.parseObject(json);
Object obj = beanclass.newInstance();
//拿到所以元素
Field[] declaredFields = beanclass.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
if (field.getGenericType().toString().equals(String.class.toString())) {
String value=jsonObject.getString(field.getName());
if(value!=null){
field.set(obj,value);
System.out.println(value);
}
} else if (field.getGenericType().toString().equals(int.class.toString())) {
if(jsonObject.getInteger(field.getName())!=null)
field.set(obj,jsonObject.getInteger(field.getName()));
}
}
return (T) obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
调用实现:
public static void main(String[] args) {
// TODO Auto-generated method stub
String json = "{\"name\":\"李先生\",\"age\":82}";
//ReflectJson.getJson();
//解析json然后换成实体类
Author author=getJsonClass(json, Author.class);
System.out.print( author.toString());
}
运行结果:
关于在怎么在Json中运用Java的反射与泛型就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。