`

Java动态性--->1 反射简介

 
阅读更多

 

 

1  动态语言:

 



 

 

 

1 Java语言动态性:

 



 

 

2 Java反射机制:

 



 

 

3 Java反射机制应用场景:

 



 

 

 

 

4  反射实例代码

 

1 bean

public class User {
	
	private int id;
	private int age;
	private String uname;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getUname() {
		return uname;
	}
	
	public void setUname(String uname) {
		this.uname = uname;
	}
	
	public void setUname() {
		this.uname = "zm";
	}
	
	private void test(){
		System.out.println("hadoop5");
	}
	
	public User(int id, int age, String uname) {
		super();
		this.id = id;
		this.age = age;
		this.uname = uname;
	}
	
	//javabean必须要有无参的构造方法! 以方便反射下 User u = clazz.newInstance();
	public User() {
	}
}



2 反射代码


public static void main(String[] args) {

		String path = "com.test.bean.User";
		
		try {
			Class<User> clazz = (Class<User>) Class.forName(path);
			
			//通过反射API调用构造方法,构造对象
			User u = clazz.newInstance();	//其实是调用了User的无参构造方法
			System.out.println(u);
			
			Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
			User u2 = c.newInstance(1001,18,"zm二");
			System.out.println(u2);
			System.out.println(u2.getUname()); // 通过反射创建实例对象后 可以直接调用对象里的Public方法
			
			//通过反射API调用普通方法
			User u3 = clazz.newInstance();
			Method method = clazz.getDeclaredMethod("setUname", String.class);// 别人给我传什么方法名 我就调用这个方法 实现动态调用方法
			method.invoke(u3, "zm三");   //u3.setUname("zm三");
			System.out.println(u3.getUname()); // zm三
			
			//通过反射API操作属性
			User u4 = clazz.newInstance();
			Field f = clazz.getDeclaredField("uname");
			f.setAccessible(true); //这个属性不需要做安全检查了,可以直接访问
			f.set(u4, "zm四");		//通过反射直接写属性
			System.out.println(u4.getUname());	//通过反射直接读属性的值
			System.out.println(f.get(u4));
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	
		
	}

 

 

5 反射带来的效率下降问题:

 

 反射机制下回导致性能低下, 如果必须使用反射,可以建议 将 setAccessible设置为true,

 表示反射的对象在使用时取消Java语言访问检查,

 

通常,

不使用反射代码效率 =  [20,30]*使用反射(setAccessible为false)

使用反射(setAccessible为false)效率 = 4*使用反射(setAccessible为true)

 

代码测试如下:

 

/**
 * 通过跳过安全检查,提高反射效率
 * 三种执行方法的效率差异比较
 * 
 * 结果:
 * 普通方法调用,执行10亿次,耗时:4549ms
反射动态方法调用,执行10亿次,耗时:88568ms
反射动态方法调用,跳过安全检查,执行10亿次,耗时:22170ms

 *
 */
public class Demo06 {
	
	public static void test01(){
		User u = new User();
		
		long startTime = System.currentTimeMillis();
		
		for (int i = 0; i < 1000000000L; i++) {
			u.getUname();
		}
		
		long endTime = System.currentTimeMillis();
		System.out.println("普通方法调用,执行10亿次,耗时:"+(endTime-startTime)+"ms"); 
	}
	
	public static void test02() throws Exception{
		User u = new User();
		Class clazz = u.getClass();
		Method m = clazz.getDeclaredMethod("getUname", null);
//		m.setAccessible(true);
		
		long startTime = System.currentTimeMillis();
		
		for (int i = 0; i < 1000000000L; i++) {
			m.invoke(u, null);
		}
		
		long endTime = System.currentTimeMillis();
		System.out.println("反射动态方法调用,执行10亿次,耗时:"+(endTime-startTime)+"ms");
	}
	
	public static void test03() throws Exception{
		User u = new User();
		Class clazz = u.getClass();
		Method m = clazz.getDeclaredMethod("getUname", null);
		m.setAccessible(true);	//不需要执行访问安全检查
		
		long startTime = System.currentTimeMillis();
		
		for (int i = 0; i < 1000000000L; i++) {
			m.invoke(u, null);
		}
		
		long endTime = System.currentTimeMillis();
		System.out.println("反射动态方法调用,跳过安全检查,执行10亿次,耗时:"+(endTime-startTime)+"ms");
	}
	
	
	public static void main(String[] args) throws Exception {
		test01();
		test02();
		test03();
	}
	
}

 

 

 

 

6 反射得到方法参数泛型类型和返回值泛型类型

 

 



 

 

/**
 * 通过反射获取泛型信息
 * 
#java.util.Map<java.lang.String, com.bjsxt.test.bean.User>
泛型类型:class java.lang.String
泛型类型:class com.bjsxt.test.bean.User
#java.util.List<com.bjsxt.test.bean.User>
泛型类型:class com.bjsxt.test.bean.User
返回值,泛型类型:class java.lang.Integer
返回值,泛型类型:class com.bjsxt.test.bean.User
 *
 */
public class Demo04 {
	
	public void test01(Map<String,User> map,List<User> list){
		System.out.println("Demo04.test01()");
	}
	
	public Map<Integer,User> test02(){
		System.out.println("Demo04.test02()");
		return null;
	}
	
	public static void main(String[] args) {

		try {
			
			//获得指定方法参数泛型信息
			Method m = Demo04.class.getMethod("test01", Map.class,List.class);
			Type[] t = m.getGenericParameterTypes();
			for (Type paramType : t) {
				System.out.println("#"+paramType);
				if(paramType instanceof ParameterizedType){
					Type[] genericTypes = ((ParameterizedType) paramType).getActualTypeArguments();
					for (Type genericType : genericTypes) {
						System.out.println("泛型类型:"+genericType);
					}
				}
			}
			
			//获得指定方法返回值泛型信息
			Method m2 = Demo04.class.getMethod("test02", null);
			Type returnType = m2.getGenericReturnType();
			if(returnType instanceof ParameterizedType){
					Type[] genericTypes = ((ParameterizedType) returnType).getActualTypeArguments();

					for (Type genericType : genericTypes) {
						System.out.println("返回值,泛型类型:"+genericType);
					}
					
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	
		
	
	}
}

 

 

7  反射操作注解 ----> 见  注解定义使用---orm映射注解使用简单介绍

 

 

8  反射main函数要注意的事:

 

Method m = c.getMethod("main",String[].class);
             m.invoke(null, (Object)new String[]{});
             //由于可变参数是JDK5.0之后才有。 如果在反射main函数时不加上 (Object)强转成一个参数的话 会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
             //m.invoke(null, (Object)new String[]{});  OK 
             //因此,必须要加上(Object)转型,避免这个问题。
             //public static void main(String[] args)

 

  • 大小: 114.3 KB
  • 大小: 40 KB
  • 大小: 177.4 KB
  • 大小: 99.9 KB
  • 大小: 142 KB
分享到:
评论

相关推荐

    java面试题--反射机制

    这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许...

    java反射 java反射 java反射java反射

    总之,Java反射机制为开发者提供了极大的灵活性,能够在运行时探索和操作类的内部细节,从而实现高度动态的程序设计。然而,过度使用反射可能会降低代码可读性和性能,因此应当权衡利弊,合理运用。

    Java 反射-动态代理

    接下来,我们讨论Java动态代理(Dynamic Proxy)。动态代理是在运行时创建代理类和代理对象,这些代理对象可以代替目标对象执行某些操作,同时提供额外的功能,如日志记录、事务管理等。Java提供两种方式实现动态...

    Java Reflection (JAVA反射)详解

    Java 反射(Java Reflection)是Java编程语言中的一种高级特性,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作,从而增加了程序的灵活性和动态性。以下是对Java反射机制的详细解释: 1. ...

    JAVA设计模式--程序设计--反射--注解--泛型

    Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...

    java反射-英文版反射规范

    本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年1月版)进行深度解析,帮助读者更好地理解反射的工作原理及其应用。 #### 二、Java反射的应用场景 Java反射广泛应用于框架...

    java-sizeof-0.0.4:一个查看java对象占用内存大小

    1. `java-sizeof-0.0.4-javadoc.jar`:这是Java文档的归档,包含了关于工具的API和方法的详细说明。通过阅读这些文档,开发者可以了解如何使用API来获取对象的内存占用信息,包括方法签名、参数解释和返回值等。 2....

    JAVA基础-反射-枚举

    ### JAVA基础-反射-枚举知识点详解 #### 一、反射概述 反射是Java语言提供的一种能在运行时分析类和对象的能力。通过反射,我们可以在程序运行时动态地获取类的信息(如类名、方法、构造函数等)并操作这些信息。 ...

    java 反射-(reflect)

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...

    Java编程的动态性

    ### Java编程的动态性——深度解析反射及其应用 #### 引言 在现代软件开发中,**Java**作为一门广泛使用的编程语言,以其强大的功能、跨平台的能力以及丰富的类库支持而著称。其中一个重要的特性就是其动态性,...

    反射实例-JAVA反射机制

    例如,在Java中,反射允许程序动态地获取类的信息、创建对象、调用方法等,这对于框架设计、插件架构等方面极为有用。 #### 二、Java中的类反射 Java的反射机制是一种强大的工具,允许程序在运行时检查和操作类、...

    java3d-1_5_1-api-docs.zip

    标题中的"java3d-1_5_1-api-docs.zip"表明这是一个关于Java3D 1.5.1版本的API文档的压缩包,对于学习和开发Java3D应用程序至关重要。 描述中提到,理解每个函数的功能是学习Java3D的关键,这确实能极大地加速学习...

    java反射规范--java资源

    反射(Reflection)是Java语言的一项重要特性,它使得Java程序能够动态地检查和修改自身结构与行为。反射的主要用途包括但不限于:获取类的信息(如类名、方法名、字段名等)、创建对象、调用方法、获取或设置字段值...

    JAVA基础--JAVA中的反射机制详解

    JAVA 反射机制是 Java 语言中的一种动态获取信息和动态调用对象方法的功能。它允许程序在运行时获取类的信息、构造对象、获取成员变量和方法、调用对象的方法等。 Java 反射机制主要提供了以下功能: 1. 在运行时...

    java反射与动态代理笔记

    Java动态代理主要由`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口组成,它们提供了一种机制,可以在运行时创建一个实现了特定接口的新类,这个新类的实例可以作为这些接口的代理,以处理...

    java-reflection-Xiangjie.rar_java 反射

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在深入理解Java反射之前,我们首先要明白什么是反射机制。反射机制是指在运行状态中,...

    java基础教程----精华版

    Java是一种广泛使用的面向对象的编程语言,以其平台独立性、安全性、健壮性和高性能而闻名。这个"java基础教程----精华版"显然是一份精心整理的资料,旨在帮助初学者快速掌握Java编程的基础知识。下面将详细介绍Java...

    Java中的反射机制

    在Java中,反射是一种非常强大的工具,它使得程序能够在运行时动态装配,无需事先进行源代码级别的链接。这种能力使得程序能够动态地获取和操作加载到Java虚拟机(JVM)中的类的内部信息,从而构建出更为灵活的应用。 ...

    java 反射的使用

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...

    Java技术----实现JAVA的动态类载入机制

    总之,Java的动态类加载机制结合反射API,为开发者提供了强大的工具来应对运行时变化和复杂的需求。理解并掌握这些概念对于编写灵活、可扩展的Java应用至关重要。通过自定义类加载器和利用反射API,我们可以实现更...

Global site tag (gtag.js) - Google Analytics