反射

简介: 反射

我们还可以通过getFields()获取所有public修饰的字段,通过getMethods()返回所有public修饰的方法。

甚至,我们还可以通过getDeclaredFields()获取更多字段,包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。对应的,getDeclaredMethods()用来获取更多方法。示例如下:

package com.cmower.java_demo.fifteen;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Author {

private String pen_name;
private String real_name;

}

class Writer extends Author {

private String honour;

private void makeMoney() {
    System.out.println("很多很多钱");
}

}

public class Test {

public static void main(String[] args) {

    Class<Writer> c4 = Writer.class;
    System.out.println(c4.getName());

    try {
        Writer wangsan = c4.newInstance();
        System.out.println(wangsan);

        Field[] fields = c4.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }

        Method[] methods = c4.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
    } catch (InstantiationException | IllegalAccessException e1) {
        e1.printStackTrace();
    }

}

}

上面的例子其实涉及到了反射,Field、Method(还有例子中未提到的Constructor)都来自java.lang.reflect类库。Class类与java.lang.reflect类库一起对反射的概念进行了支持。

有时候,我们需要从磁盘文件或网络文件中读取一串字节码,并把它转换成一个类,这时候就需要用到反射。最常见的典型例子就是将一串JSON字符串(在网络传输中最初的形态可能是字节数组)反射为对应类型的对象。

阿里巴巴提供的FastJSON提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。FastJSON的内部其实用的就是反射机制。

package com.cmower.common.util;

import java.io.UnsupportedEncodingException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.alibaba.fastjson.JSON;

@SuppressWarnings("all")
public class JsonUtil {

private static Log logger = LogFactory.getLog("json");

public static byte[] objectToByte(Object obj) throws UnsupportedEncodingException {
    String jsonStr = JSON.toJSONString(obj);
    logger.debug("序列化后数据:" + jsonStr);
    return jsonStr.getBytes("UTF-8");
}

public static <T> T byteToObject(byte[] data, Class<T> obj) throws UnsupportedEncodingException {
    String objectString = new String(data, "UTF-8");
    logger.debug("反序列化后数据 : " + objectString);
    return JSON.parseObject(objectString, obj);
}

public static <T> Object stringToObject(String data, Class<T> obj) throws UnsupportedEncodingException {
    logger.debug("反序列化后数据 : " + data);
    return JSON.parseObject(data, obj);
}

}

相关文章
反射
何为反射?在运行状态时,对于任何一个类,都能够动态获取这个类得所有方法和属性(私有,公有,受保护),都能够调用任意一个方法和属性。
45 0
|
4月前
|
缓存 安全 Java
反射带来的问题
反射带来的问题
37 0
|
4月前
|
存储 缓存
优美的使用反射,哪些场景推荐使用反射,哪些不推荐使用
优美的使用反射,哪些场景推荐使用反射,哪些不推荐使用
39 0
|
7月前
|
API C# 数据库
C#反射详解
C#反射详解
67 0
|
Java 数据库连接 数据库
JVAVEE反射
JVAVEE反射
56 0
|
安全 数据可视化 IDE
反射(二)什么是反射
反射(二)什么是反射
72 0
|
存储 Java 索引
反射理解
个人对反射的学习理解与代码
75 0
|
缓存 前端开发 JavaScript
一起来学反射(上)
一起来学反射
105 0
|
设计模式 安全 Java
一起来学反射(下)
一起来学反射
103 0
|
Java
简单理解下反射是啥
《基础系列》
107 0