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)
相关推荐
这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许...
总之,Java反射机制为开发者提供了极大的灵活性,能够在运行时探索和操作类的内部细节,从而实现高度动态的程序设计。然而,过度使用反射可能会降低代码可读性和性能,因此应当权衡利弊,合理运用。
接下来,我们讨论Java动态代理(Dynamic Proxy)。动态代理是在运行时创建代理类和代理对象,这些代理对象可以代替目标对象执行某些操作,同时提供额外的功能,如日志记录、事务管理等。Java提供两种方式实现动态...
Java 反射(Java Reflection)是Java编程语言中的一种高级特性,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作,从而增加了程序的灵活性和动态性。以下是对Java反射机制的详细解释: 1. ...
Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...
本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年1月版)进行深度解析,帮助读者更好地理解反射的工作原理及其应用。 #### 二、Java反射的应用场景 Java反射广泛应用于框架...
1. `java-sizeof-0.0.4-javadoc.jar`:这是Java文档的归档,包含了关于工具的API和方法的详细说明。通过阅读这些文档,开发者可以了解如何使用API来获取对象的内存占用信息,包括方法签名、参数解释和返回值等。 2....
### JAVA基础-反射-枚举知识点详解 #### 一、反射概述 反射是Java语言提供的一种能在运行时分析类和对象的能力。通过反射,我们可以在程序运行时动态地获取类的信息(如类名、方法、构造函数等)并操作这些信息。 ...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...
### Java编程的动态性——深度解析反射及其应用 #### 引言 在现代软件开发中,**Java**作为一门广泛使用的编程语言,以其强大的功能、跨平台的能力以及丰富的类库支持而著称。其中一个重要的特性就是其动态性,...
例如,在Java中,反射允许程序动态地获取类的信息、创建对象、调用方法等,这对于框架设计、插件架构等方面极为有用。 #### 二、Java中的类反射 Java的反射机制是一种强大的工具,允许程序在运行时检查和操作类、...
标题中的"java3d-1_5_1-api-docs.zip"表明这是一个关于Java3D 1.5.1版本的API文档的压缩包,对于学习和开发Java3D应用程序至关重要。 描述中提到,理解每个函数的功能是学习Java3D的关键,这确实能极大地加速学习...
反射(Reflection)是Java语言的一项重要特性,它使得Java程序能够动态地检查和修改自身结构与行为。反射的主要用途包括但不限于:获取类的信息(如类名、方法名、字段名等)、创建对象、调用方法、获取或设置字段值...
JAVA 反射机制是 Java 语言中的一种动态获取信息和动态调用对象方法的功能。它允许程序在运行时获取类的信息、构造对象、获取成员变量和方法、调用对象的方法等。 Java 反射机制主要提供了以下功能: 1. 在运行时...
Java动态代理主要由`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口组成,它们提供了一种机制,可以在运行时创建一个实现了特定接口的新类,这个新类的实例可以作为这些接口的代理,以处理...
Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在深入理解Java反射之前,我们首先要明白什么是反射机制。反射机制是指在运行状态中,...
Java是一种广泛使用的面向对象的编程语言,以其平台独立性、安全性、健壮性和高性能而闻名。这个"java基础教程----精华版"显然是一份精心整理的资料,旨在帮助初学者快速掌握Java编程的基础知识。下面将详细介绍Java...
在Java中,反射是一种非常强大的工具,它使得程序能够在运行时动态装配,无需事先进行源代码级别的链接。这种能力使得程序能够动态地获取和操作加载到Java虚拟机(JVM)中的类的内部信息,从而构建出更为灵活的应用。 ...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...
总之,Java的动态类加载机制结合反射API,为开发者提供了强大的工具来应对运行时变化和复杂的需求。理解并掌握这些概念对于编写灵活、可扩展的Java应用至关重要。通过自定义类加载器和利用反射API,我们可以实现更...