最近项目中遇到了Json数据自动获取的功能,不然令人想起java的反射,已经很长时间没复习java了正好一块连java的这一块内容一起过一遍。java中的反射无疑就相当于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数据的保存###

//利用反射获取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());
}

运行结果:

Java反射,泛型在Json中的运用的更多相关文章

  1. Java 反射在实际开发中的应用

    运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...

  2. 【译】9. Java反射——泛型

    原文地址:http://tutorials.jenkov.com/java-reflection/generics.html ===================================== ...

  3. [转]Java 反射在实际开发中的应用

    一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2  :RTT ...

  4. java反射查看jar包中所有的类名方法名

    不反编译,不用其他工具,用java反射查看jar包中所有的类名方法名,网上很多都报错,下面这个你试试看:话不多说直接撸代码: import java.lang.reflect.Field; impor ...

  5. java反射 顺序输出类中的方法

    java反射可以获取一个类中的所有方法,但是这些方法的输出顺序,并非代码的编写顺序. 我们可以通过自定义一个注解来实现顺序输出类中的方法. 首先,先写一个类,定义增删改查4个方法 public cla ...

  6. Java反射及其在Android中的应用学习总结

    一. Java反射机制 Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制同意程序在执行时透过Reflection APIs取得不论什么一个已知名称的class的内部信 ...

  7. 利用JAVA反射机制将JSON数据转换成JAVA对象

    net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大,  这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用,   有些数据类型需要进行转 ...

  8. Java反射——引言

    Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...

  9. 【译】1. Java反射——引言

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...

随机推荐

  1. tensorflow(四)

    tensorflow数据处理方法, 1.输入数据集 小数据集,可一次性加载到内存处理. 大数据集,一般由大量数据文件组成,因为数据集的规模太大,无法一次性加载到内存,只能每一步训练时加载数据,可以采用 ...

  2. ANT下载和配置 IDEA

    1.下载地址大全: http://archive.apache.org/dist/ant/binaries/ jdk与ant版本有对应关系,目前知道: jdk1.7与ant1.10不兼容,1.7必须用 ...

  3. 简单的使用httpclient读取网页html例子

    public void clientPost(String url) {  /* 1 生成 HttpClinet 对象并设置参数*/    HttpClient httpClient=new Http ...

  4. swift中的坑

    1.NSClassFromString //获取工程名称 let group = Bundle.main.infoDictionary let fileName = group?[kCFBundleE ...

  5. iTOP-4412开发板qt4文件的移植和修改

    在 7.4 小节介绍配置文件的时候,提到迅为制作的触摸库文件“/usr/local/tslib”,迅为 已经将触摸功能编译到 Qt/E4.7.1 的库文件中,开发板可以支持触摸和鼠标功能. 用户在前面 ...

  6. P2486 [SDOI2011]染色 区间合并+树链剖分(加深对线段树的理解)

    #include<bits/stdc++.h> using namespace std; ; struct node{ int l,r,cnt,lazy; node(,,,):l(l1), ...

  7. Mybatis的generator自动生成代码

    mybatis-generator有三种用法:命令行.ide插件.maven插件.本次使用maven生成 环境:IDEA,mysql8,maven (1):新建项目,本次以SpringBoot项目为例 ...

  8. 调用支付JSAPI缺少参数:sign

    微信jsapi调用微信支付时报 :调用支付JSAPI缺少参数:sign 这个问题我查了很久,最后把前端的代码也拿过来看来,发现前端 sign的参数名传错了~~~~~~~前后端分离很容易出现这种问题,对 ...

  9. 标题艺术与技术的完美结合,LG画廊OLED电视正式发布!

      由LG电子举办的"旷世巨作---面向未来的电视"主题沙龙于3月10号在王府井亚洲首家数字化奥迪展厅拉开帷幕.此次活动宣布了LG画廊OLED电视在国内市场上市.而我有幸参加了此次 ...

  10. 吴裕雄--天生自然Android开发学习:1.2 开发环境搭建

    现在主流的Android开发环境有: ①Eclipse + ADT + SDK ②Android Studio + SDK ③IntelliJ IDEA + SDK 现在国内大部分开发人员还是使用的E ...