1,java 的反射 让我们可以通过字符串类名生成类的实例,调用类方法,或者传递一个实例调用该实例的方法(例如通过反射调用该实例的多个方法)
2,框架的实现大多使用了反射技术,只要有配置类名的地方就有反射的存在(例如struts的action配置、Hibernate 的
对象持久层的映射配置,以及spring的bean的配置)
3,反射的用处:动态的创建实例,动态的调用方法,以及动态的修改字段。
java的反射测试:
public class User implements UserInterface1,UserInterface2 {
public String name;
private String password;
// public static int age =10;
public static void StaticMethod(String param){
System.out.println("静态方法参数"+param);
}
public User(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.test.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflection {
public Object getProperty(Object obj,String name) throws Exception{
Class ClassObj=obj.getClass();
Field publicf = ClassObj.getField(name);
Object Property = publicf.get(obj);
return Property;
}
public Object getStaticProperty(String className, String fieldName) throws Exception{
Class ClassObj = Class.forName(className);
Field staticf= ClassObj.getField(fieldName);
Object Property = staticf.get(ClassObj);
return Property;
}
public void invokeMethod(Object obj,String methodName ,Object[] args) throws Exception{
Class ClassObj = obj.getClass();
Class[] Classargs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
Classargs[i] = args[i].getClass();
}
Method method = ClassObj.getMethod(methodName, Classargs );
method.invoke(obj, args);
}
public void invokeStaticMethod(String className , String staticMethodName, Object[]args)
throws Exception{
Class ClassObj = Class.forName(className);
Class[] Classargs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
Classargs[i] = args[i].getClass();
}
Method method = ClassObj.getMethod(staticMethodName, Classargs);
method.invoke(null, args);
}
public Object newInstance(String className,Object[]args ) throws Exception{
Class ClassObj = Class.forName(className);
Class[] Classargs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
Classargs[i] = args[i].getClass();
}
Constructor constructor = ClassObj.getConstructor(Classargs);
Object obj = constructor.newInstance(args);
return obj;
}
public boolean isInstance(Class cla , Object obj){
return cla.isInstance(obj);
}
public Class[] getInterfaces(String ClassName ) throws Exception{
Class ClassObj = Class.forName(ClassName);
Class[] Is = ClassObj.getInterfaces();
for (int i = 0; i < Is.length; i++) {
System.out.println(Is[i].getName());
}
return Is;
}
public static void main(String[] args) throws Exception {
/*
Reflection reflection = new Reflection();
User user= new User();
user.setName("ysen");
Object object=reflection.getProperty(user, "name");
System.out.println(object);*/
/* Reflection reflection = new Reflection();
Object object=reflection.getStaticProperty("com.test.reflection.User", "age");
System.out.println(object); */
/* Reflection reflection = new Reflection();
User user= new User();
reflection.invokeMethod(user, "setName", new Object[]{"ysen"});
System.out.println(user.getName()); */
/* Reflection reflection = new Reflection();
User user= new User();
reflection.invokeStaticMethod("com.test.reflection.User", "StaticMethod", new Object[]{"ysen"});
*/
/* Reflection reflection = new Reflection();
User user = (User)reflection.newInstance("com.test.reflection.User", new Object[]{"ysen"});
System.out.println(user.getName());*/
/*Reflection reflection = new Reflection();
reflection.getInterfaces("com.test.reflection.User");
*/
/*
Class userClass = User.class;
Field[] userProperty= userClass.getFields();
for (Field field : userProperty) {
System.out.println(field.getName());
}*/
// 获取User自身定义的属性名称,不论 public 或private 或其它类型皆可获得
/*Class userClass = User.class;
Field[] userProperty= userClass.getDeclaredFields();
for (Field field : userProperty) {
System.out.println(field.getName());
}
*/
/* Class userClass = User.class;
Method[] userMethods= userClass.getDeclaredMethods();
for (Method m : userMethods) {
System.out.println(Modifier.toString(m.getModifiers())+" "+ m.getReturnType() +" "+ m.getName() +"()" );
}
*/
/*Class userClass = User.class;
Field[] userFields= userClass.getDeclaredFields();
User user= new User("");
for ( Field f : userFields) {
f.setAccessible(true);
f.set(user, "ysen");
//f.get(user);
System.out.println(f.getName()+f.isAccessible() );
System.out.println(user.getName());
}
*/
}
}
分享到:
相关推荐
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心在于`java.lang.Class`类以及相关的类和接口,如`java.lang.reflect`包下...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
个人学习总结,java反射,思维导图 个人学习总结,java反射,思维导图
下面将详细介绍Java反射机制的基本概念、工作机制及其应用。 #### 1. 检测类 **1.1 reflection的工作机制** 为了理解反射的工作原理,我们可以从一个简单的示例开始。下面的代码展示了如何使用Java反射API来获取...
下面我们将深入探讨Java反射的核心知识点。 1. **Chp16** - 可能指的是某个教程或书籍中的第16章,专门讲解反射。在Java中,反射通常被视为高级主题,涉及JVM(Java虚拟机)和元数据的交互。通过Java.lang.Class类...
总结来说,Java反射提供了一种动态操控Java对象的能力,允许我们在运行时发现和改变类的行为。虽然它强大且灵活,但也应谨慎使用,因为它可能会降低代码的可维护性和安全性。在实际开发中,反射常用于框架、插件系统...
总结,Java反射机制是Java平台灵活性和动态性的体现,它极大地扩展了Java程序的能力,但同时也需要谨慎使用,平衡好其带来的便利和潜在问题。学习和理解反射机制对于深入理解Java以及开发复杂系统至关重要。
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...
总结一下,Java反射机制为我们提供了在运行时检查和操作类、方法的能力。通过`Class.forName()`获取Class对象,再利用`getMethod()`获取方法,最后使用`invoke()`执行方法。在实际开发中,理解并谨慎使用反射,能够...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...
总结,Java反射机制提供了对运行时类信息的强大访问能力,虽然存在潜在的风险,但在许多场景下,如框架开发、动态代理、元编程等,它的优势是无可替代的。学习和熟练掌握Java反射,能够显著提升编程的灵活性和解决...
Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 ...总结而言,Java反射机制是构建灵活、可扩展应用程序的强大工具。然而,在使用反射时,开发者应当权衡其带来的好处和潜在的风险,确保合理有效地利用这一特性。
Java反射是Java语言的一种强大的特性,它允许程序在运行时检查和操作类、接口、对象以及它们的属性和方法。本文将深入探讨Java反射的概念,通过实例解析如何使用反射来获取对象属性值,并介绍Class类、基本数据类型...
本文将从基础到进阶,全面总结Java反射的使用。 **一、反射初识** 反射的核心在于Java运行时能动态地获取类的信息,包括类名、属性、方法、构造器等。通常,我们创建对象是通过类名直接new,而反射则是通过字符串...
### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...
JAVA反射知识总结涉及到的主要知识点包括: 1. 反射的基本概念: 反射是Java语言中的一个特性,允许程序在运行期间动态地访问和操作类、方法、成员变量等组件。通过反射,可以突破访问控制,动态创建对象,调用方法...
本文介绍了JAVA反射类的基本概念,欢迎阅读学习,一起进步。 文章目录一.反射的基本概念二.反射常用类三.使用反射的基本步骤四.Class类讲解(1)Class类是反射机制的起源和入口(2)Class类存放类的结构信息(3)...
总结来说,Java反射机制提供了强大的动态性,使得程序员可以在运行时动态地操作类和对象,而动态代理则进一步扩展了这一能力,允许我们在调用方法前后期添加自定义逻辑。虽然反射和动态代理增加了程序的复杂性,但在...