反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。
2.1 概述
Class对象是反射的起点,可以利用类的Class对象创建类的实例(newInstance),同时提供了操作类的工具,可以获取类的详细信息,并且使用特殊的技术实现类的加载(运行时加载,在编译的时候还没有该类的class文件)。
2.2 Class对象的获取方式
3.1概述
Class对象提供了很多获取类信息的工具,可以获取类的方法,属性,进行类型判断,创建类的对象实例等等。
3.2 相关API介绍
public class Main {
public static void main(String[] atgs) throws ClassNotFoundException {
printTypeInfo("MyClass");
}
/**
获取类的构造函数
*/
public static void printTypeInfo(String className){
try {
Class<?> c = Class.forName(className);
Constructor<?>[] constructors=c.getConstructors();
for(Constructor<?> constructor:constructors){
System.out.println(constructor);
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
class MyClass {
private int num=10;
public MyClass(int num){
this.num=num;
}
public MyClass(){
}
@Override
public String toString(){
return String.format("%d",num);
}
}
备注:1.使用反射创建类的实例,Class.newInstance(),类中必须又一个无参数的构造函数,否则会报错。
public MyClass()
Constructor<?> constructor=c.getConstructor(int.class); MyClass myClass=(MyClass)constructor.newInstance(5); System.out.println(myClass);
public static void printTypeInfo(String className) {
try {
Class<?> c=Class.forName(className);
for(Method method:c.getMethods()){
System.out.println(method);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
Class<?> c=Class.forName(className);
Method method=c.getMethod("getInfo",String.class);
System.out.println(method.invoke(c.newInstance(),new String("123")));
}
class MyClass {
private int num=10;
public MyClass(int num){
this.num=num;
}
public MyClass(){
}
public String getInfo(String string){
return String.format("get : %s",string);
}
@Override
public String toString(){
return String.format("%d",num);
}
}
public static void printTypeInfo(String className) {
try {
Class<?> c=Class.forName(className);
Field[] fields=c.getDeclaredFields();
for(Field field:fields){
System.out.println(field);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
field.setAccessible(true); field.set(myClass,123);
public class Main {
public static void main(String[] atgs) {
proxy proxy=new ProxyServer(new RealServer());
proxy.doSomthing();
}
}
interface proxy{
void doSomthing();
}
class RealServer implements proxy{
@Override
public void doSomthing(){
System.out.println("doSomething from RealServer");
}
}
class ProxyServer implements proxy{
private proxy realServer;
public ProxyServer(proxy realServer){
this.realServer=realServer;
}
@Override
public void doSomthing(){
realServer.doSomthing();
}
}
import java.lang.reflect.*;
/**
* Created by yangyun on 2016/11/30.
*/
public class Main {
public static void main(String[] atgs) {
myProxy myProxyInterface=(myProxy) Proxy.newProxyInstance(
RealServer.class.getClassLoader(),
RealServer.class.getInterfaces(),
new ProxyHandler(new RealServer())
);
myProxyInterface.doSomthing();
}
}
interface myProxy{
void doSomthing();
}
class RealServer implements myProxy{
public RealServer(){
}
@Override
public void doSomthing(){
System.out.println("from RealServer doSomething()");
}
}
class ProxyHandler implements InvocationHandler{
private Object realProxy;
public ProxyHandler(Object realProxy){
this.realProxy=realProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before invoke()");
Object result=method.invoke(realProxy,args);
System.out.println("after invoke()");
return result;
}
}
有什么意义?
https://www.zhihu.com/question/24304289
http://blog.csdn.net/xu__cg/article/details/52882023
http://blog.csdn.net/liujiahan629629/articzle/details/18013523
http://www.cnblogs.com/xiaoluo501395377/p/3383130.html
原文:http://www.cnblogs.com/yangyunnb/p/6126109.html