什么是java反射?核心在于一个对动态二字的理解,即:在运行状态中,能动态获取类的属性和方法,以及动态调用对象的属性和方法。
反射的作用:一方面用于反编译(.class到.java文件),另一方面用来动态访问对象的属性、方法等。
反射机制中主要的类:
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
下面贴出一些示例代码:
package com.tu.test.reflect;
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = 9016949872478554542L;
public User() {
}
public User(String name,int age,String phone){
this.name = name;
this.age = age;
this.phone = phone;
}
private String name;
private int age;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
package com.tu.test.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectTest {
//获取User类型
public static void getUser() throws Exception{
/**1、获取类**/
//获取类的第一种方法
Class clz1 = Class.forName("com.tu.test.reflect.User");
//获取类的第二种方法(java中每个类型都有class属性)
Class clz2 = User.class;
//获取类的第三种方法(java中任何一个对象都有getClass()方法)
User user = new User();
Class clz3 = user.getClass();
/**2、创建对象**/
Object userObj = clz1.newInstance();
/**3、获取类的所有属性、方法等信息**/
Field[] fields = clz1.getDeclaredFields();
StringBuilder fieldSb = new StringBuilder();
for (Field field : fields) {
fieldSb.append(Modifier.toString(field.getModifiers())).append(" ");
fieldSb.append(field.getType().getName()).append(" ");
fieldSb.append(field.getName()).append(" ");
fieldSb.append("\n");
}
System.out.println("User类的所有属性信息:" + fieldSb.toString());
Method[] methods = clz1.getDeclaredMethods();
StringBuilder methodSb = new StringBuilder();
for (Method method : methods) {
methodSb.append(Modifier.toString(method.getModifiers())).append(" ");
methodSb.append(method.getReturnType().getName()).append(" ");
methodSb.append(method.getName()).append(" ");
Class<?>[] paramClzs = method.getParameterTypes();
methodSb.append("(");
for (Class<?> paramClz : paramClzs) {
methodSb.append(paramClz.getName());
}
methodSb.append(method.getParameterTypes()).append(")");
methodSb.append("\n");
}
System.out.println("User类的所有方法信息:" + methodSb.toString());
Constructor[] constructors = clz1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println("构造方法:" + constructor.getName());
}
/**4、获取特定属性**/
Field name = clz1.getDeclaredField("name");
name.setAccessible(true);//反射机制可打破java封装
name.set(userObj, "wuhoujian");
System.out.println("My name is : " + name.get(userObj));
}
public static void main(String[] args) {
try {
getUser();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
User类的所有属性信息:private static final long serialVersionUID
private java.lang.String name
private int age
private java.lang.String phone
User类的所有方法信息:public int getAge ([Ljava.lang.Class;@19bb25a)
public void setAge (int[Ljava.lang.Class;@da6bf4)
public java.lang.String getPhone ([Ljava.lang.Class;@1e58cb8)
public void setPhone (java.lang.String[Ljava.lang.Class;@179935d)
public java.lang.String getName ([Ljava.lang.Class;@b9e45a)
public void setName (java.lang.String[Ljava.lang.Class;@3ef810)
构造方法:com.tu.test.reflect.User
构造方法:com.tu.test.reflect.User
My name is : wuhoujian
补充一个示例:
package com.ali.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; /** * Created by hjwue on 2016/11/24. */ public class DumpMethods { public static void main(String[] args) { try { Class myClass = Class.forName("java.util.HashMap"); System.out.println("Show all constructors:"); Constructor[] constructors = myClass.getDeclaredConstructors(); System.out.println("The size of all constructors is:" + constructors.length); Arrays.asList(constructors).forEach(constructor -> System.out.println(constructor.toString())); System.out.println("Show all public constructors:"); Constructor[] publicConstructors = myClass.getConstructors(); System.out.println("The size of all constructors is:" + publicConstructors.length); Arrays.asList(publicConstructors).forEach(publicConstructor -> System.out.println(publicConstructor.toString())); System.out.println("Show all fields:"); Field[] fields = myClass.getDeclaredFields(); System.out.println("The size of all fields is : " + fields.length); Arrays.asList(fields).forEach(field -> System.out.println(field.toString())); System.out.println("Show all public fields:"); Field[] publicFields = myClass.getFields(); System.out.println("The size of all public fields is : " + publicFields.length); Arrays.asList(publicFields).forEach(publicField -> System.out.println(publicField.toString())); System.out.println("Show all methods:"); Method[] methods = myClass.getDeclaredMethods(); System.out.println("The size of all method is : " + methods.length); Arrays.asList(methods).forEach((m -> System.out.println(m.toString()))); System.out.println("Show all public methods:"); Method[] publicMethods = myClass.getMethods(); System.out.println("The size of all public method is : " + publicMethods.length); Arrays.asList(publicMethods).forEach(publicMethod -> System.out.println(publicMethod.toString())); } catch(Exception e){ e.printStackTrace(); } } }
注:关于上面为提到的操作方法,参考URL:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
API文档是一个很好的老师,大家平时要多查阅一下。
相关推荐
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。
以下我们将深入探讨Java反射的基本概念、主要API以及如何通过给定的代码示例来理解反射的应用。 首先,让我们了解什么是类的反射。在Java中,`java.lang.Class` 类代表了运行时的类信息。我们可以通过一个类的全名...
Could not download kotlin-reflect.jar 这个问题 是墙的原因 没有下载下来kotlin-reflect.jar的jar包资源。 把下载的kotlin-reflect-1.3.70.jar,放在版本文件的子目录中,重新启动电脑就可以。网上都有对应的操作...
kotlin-reflect.jar
【Java反射机制详解】 在Java编程中,反射机制是一个强大的工具,它允许程序在运行时检查自身,并且能够动态地操作类和对象的内部信息。这个特性使得Java代码具有高度的灵活性,能够在不修改源码的情况下,根据需要...
标签:reflect、scala、lang、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
### Java反射机制详解 #### 15.1 Java反射机制概览 ##### 15.1.1 什么是Java反射? 反射(Reflection)是Java语言的一个核心特性,它允许程序在运行时动态地获取对象类型信息,并且可以利用这些信息进行诸如创建...
而"cpp-reflect在C++17中轻松实现反射和序列化"的主题则探讨了在C++17标准下,如何利用预C++20的手段来实现类似的功能,这对于想要提前尝鲜或者在不支持C++20的编译器环境下工作的人来说非常有价值。 反射通常包括...
在 Java 中,反射机制主要通过 java.lang.reflect 包中的类和接口来实现。下面是对反射机制的详细解释: 获取对象的属性 在 Java 中,可以使用反射机制来获取对象的属性。例如,以下代码可以获取某个对象的属性: ...
JAVA REFLECT (java 反射) 取得类的继承结构 - 类所在的包; |- public Package getPackage() - 类的声明方式; |-取得全类名:public String getName() |-只取类名: public String getSimpleName() - 类所继承...
### Java反射机制详解 #### 引言 Java的反射机制是一种强大的编程工具,它使得Java程序能够在运行时检查和操作自身结构与行为的能力。这种能力不仅增强了Java的灵活性,也使其成为实现动态代理、框架搭建(如Spring...
### Java软件开发实战:反射与动态代理 #### 反射技术概述 反射是Java中一项强大的功能,允许程序在运行时获取类的信息并操作类的对象。这种能力在编写需要高度灵活性的应用程序时非常有用,例如在框架开发中,...
Java反射(Reflect)是Java语言中的一个重要特性,它允许运行时的Java程序访问、操作类、接口、字段和方法的信息,甚至动态调用方法。在Java编程中,反射提供了强大的能力,可以用来实现一些高级功能,如元编程、...
Java SE 5.0 API中引入了`java.lang.reflect.AnnotatedElement`接口,它定义了用于反射性读取标注信息的四种方法: 1. **getAnnotation(Class annotationType)**:如果元素具有指定类型的标注,则返回这些标注;...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
This is a tool library for Kotlin to use java reflect APIs in Kotlin simply method.It can modify or read the top level private visible property value in Kotlin way. Note: This tools only availible ...
kotlin-reflect-1.3.20.jar