Java 反射详解

7人阅读 评论(0) 收藏 举报
分类:
1.为什么使用反射?
    我们都知道类用于描述现实生活中的一类事物,若需要描述某一个事物,通过 new 关键字, 创建其对象操作其属性,调用其方法。但在某种情况下,我们需要得知并使用一个在编译时完全未知的类,创建其对象,调用其属性和方法,这个时候就需要反射。
    反射机制(Reflection):反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    Class 是开启反射的源头!

2.如何获取 Class 实例?
//1. 通过运行时类的属性 class
Class clazz = Person.class;

//2. 通过运行时类对象的 getClass() 方法
Person p = new Person();
Class clazz2 = p.getClass();

//3. 通过 Class 类中的静态方法  forName(String className)
String className = "com.meicai.collection.Person";
Class clazz3 = Class.forName(className);

//4. 通过类加载器(了解)
ClassLoader cl = this.getClass().getClassLoader();
Class clazz4 = cl.loadClass(className);
代码示例:
public class TestReflection {
     @Test
     public void test2() throws ClassNotFoundException{
         //1. 通过运行时类的属性 class
         Class clazz1 = Person.class;
         System.out.println("通过运行时类的属性 class :"+clazz1);

         //2. 通过运行时类对象的 getClass() 方法
         Person p = new Person();
         Class clazz2 = p.getClass();
         System.out.println("通过运行时类对象的 getClass() 方法:"+clazz2);

         //3. 通过Class类的静态方法 forName(String className)
         String className = "com.meicai.collection.Person";

         Class clazz3 = Class.forName(className);
         System.out.println("通过Class类的静态方法 forName(String className):"+clazz3);

         //4. 通过类加载器
         ClassLoader cl = this.getClass().getClassLoader();
         Class clazz4 = cl.loadClass(className);
         System.out.println("通过类加载器:"+clazz4);
     }
}
运行结果:
通过运行时类的属性 class :class com.meicai.collection.Person
通过运行时类对象的 getClass() 方法:class com.meicai.collection.Person
通过Class类的静态方法 forName(String className):class com.meicai.collection.Person
通过类加载器:class com.meicai.collection.Person
3.反射的功能
    ① 在运行时判断一个对象所属的类
    ② 在运行时创建任意一个类的对象
    ③ 在运行时判断一个对象的属性和方法
    ④ 在运行时调用一个对象的属性和方法
    ⑤ 生成动态代理

4.动态代理:
(1) 普通代理:
     说明:由于之前的普通代理会产生多个代理对象,煤老板一个代理对象,与钢铁老板一个代理对象,这样,我们能不能让一个代理去同时为多个老板代理业务呢?于是就有了我们下面的动态代理来解决这个问题。
(2) 动态代理:
public class SteelBoss implements Boss{

	@Override
	public void meet() {
		System.out.println("与钢铁老板见面");
	}

	@Override
	public void consume() {
		System.out.println("让钢铁老板消费");
	}

}
public class CoalBoss implements Boss{

	@Override
	public void meet() {
		System.out.println("与煤老板见面");
	}

	@Override
	public void consume() {
		System.out.println("让煤老板消费");
	}

}
/*
 * 动态代理(了解):需要实现接口 InvocationHandler
 * public Object invoke(Object proxy, Method method, Object[] args)
 * 
 * proxy : 动态生成的代理对象
 * method : 需要代理对象执行方法的 Method 的实例
 * args : 执行方法需要的参数
 */
public class DynaProxyHandler implements InvocationHandler{
	
	//目标对象
	private Object target;
	
	//生成动态代理对象
	public Object newProxyInstance(Object target){
		this.target = target;
		
		/*
		 * 第一个参数:通常与目标对象的类加载器保持一致!
		 * 
		 * 第二个参数:通常与目标对象实现的接口一致!
		 * 
		 * 第三个参数:需要实现了 InvocationHandler 接口实现类的实例。(目的,执行接口中的 invoke() 方法)
		 */
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
	

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("-----代理开始-----");
		
		Object obj = method.invoke(target, args);
		
		System.out.println("-----代理结束-----");
		return obj;
	}

}
public class SteelBoss implements Boss{

	@Override
	public void meet() {
		System.out.println("与钢铁老板见面");
	}

	@Override
	public void consume() {
		System.out.println("让钢铁老板消费");
	}

}
/*
 * 动态代理:
 */
public class TestProxy {
	
	public static void main(String[] args) {
		
		DynaProxyHandler dph = new DynaProxyHandler();
		
		Boss boss = (Boss) dph.newProxyInstance(new CoalBoss());
		boss.meet();
		boss.consume();
		
		System.out.println("-----------------------");
		Boss sb = (Boss) dph.newProxyInstance(new SteelBoss());
		sb.meet();
		sb.consume();
	}

}


查看评论

java 反射详解通俗易懂

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。  那么什么是Java的反射呢?        大家都知道,要...
  • MissWwg
  • MissWwg
  • 2016年06月13日 18:33
  • 28335

【框架基础】:Java反射机制详解(一)

在学习框架设计之前,先来了解一下框架基础——Java反射机制。         一、什么是反射机制         反射机制是在程序运行状态时,对于任意一个类,都能够知道这个类的所有属性和方法;对...
  • erlian1992
  • erlian1992
  • 2016年11月29日 15:13
  • 1746

java反射详解---反射的理论知识

此篇主要讲解下反射的理论概念,另外一篇则是有很多的实际反射的例子,链接如下: 不要看着多,但是功能就是下面描述的反射的作用 一、JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允...
  • qq_27093465
  • qq_27093465
  • 2016年08月20日 00:21
  • 999

Java反射机制(源码反射优势解析)

Java反射机制 一、什么是反射机制          简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,      那么就可以通过反射机制来获得...
  • changlei_shennan
  • changlei_shennan
  • 2017年03月08日 11:16
  • 1484

java反射例子详解

1、通过一个对象获得完整的包名和类名  Java代码   package Reflect;     /**  * 通过一个对象获得完整的包名和类名  * */  class Dem...
  • justdoit_potato
  • justdoit_potato
  • 2016年03月30日 10:21
  • 1017

JAVA中的反射机制

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧!            一,先看一下反射的概念:      ...
  • liujiahan629629
  • liujiahan629629
  • 2014年01月08日 22:31
  • 377880

ProtoBuf 中的反射机制

我们先看一下JAVA反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 反射是Java中一种强大的...
  • abccheng
  • abccheng
  • 2017年03月17日 17:43
  • 1396

Java反射入门

Java这么多高灵活性,很多都是利用反射来实现的,所谓的反射是指,编译期间完全未知的classes,运行时,对任一个类(根据类名-字符串),能够知道这个类的所有属性和方法;对于任一个对象,都能够调用它...
  • wang379275614
  • wang379275614
  • 2014年05月25日 14:39
  • 1445

Java反射实例(实战方能理解jdk的各种方法)

什么是反射?反射有什么用处? 1. 什么是反射? “反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。”这个概念常常会和内省(Introspection)混淆,以下是这...
  • hupoling
  • hupoling
  • 2017年05月17日 10:18
  • 645

java反射基础,Beanfactory原理反射解析

一、java反射基础       1、创建一个类:  Car.java public class Car { private String brand; private S...
  • zhuyu714997369
  • zhuyu714997369
  • 2016年07月18日 17:07
  • 1046
    个人资料
    持之以恒
    等级:
    访问量: 9万+
    积分: 3216
    排名: 1万+
    最新评论