- 浏览: 236909 次
- 性别:
- 来自: 常州
文章分类
- 全部博客 (165)
- Java基础 (49)
- 开发工具 (3)
- Python基础 (1)
- Oracle基础 (9)
- Java 符号计算 (0)
- 计算机基本原理 (10)
- SQL (6)
- javascript (16)
- HTML (2)
- XML (4)
- 程序员之路 (7)
- JDBC (1)
- Unicode (0)
- 字符编码 (3)
- JSP基础 (2)
- Servlet&JSP (9)
- MySQL基础 (1)
- UML基础 (1)
- Hibernate (2)
- Java包 (1)
- Spring (1)
- Struts2 (9)
- 系统命令 (1)
- Tomcat (1)
- Windows (1)
- Android (1)
- C#基础 (14)
- HTML5 (1)
- .NET基础 (1)
- 数据库基础 (2)
- ASP.NET基础 (7)
- 开源Java (3)
- 趣味算法 (1)
- 面向对象思想 (1)
- 软件应用 (1)
- Web工程 (1)
- jquery (2)
- JPA (0)
- 设计模式 (0)
最新评论
-
静夜独窗:
JavaBean组件能说的具体一点吗,我感觉这样说理解的不清晰 ...
EL 表达式语言 -
静夜独窗:
在Java中,不同字符集编码的转换是通过Unicode作为中介 ...
JavaWeb中的乱码产生与解决方案
反射(reflect),本来是动态语言中的特性。Java中的反射相对于Python来看就有点难看了。
为了体现反射。首先定义一个接口和一个实现类。
public interface TestInterFace { public void TestInterFace(); }
public class TestClass extends Object implements TestInterFace { // 字段 private String testClassName = ""; protected double[] doubleTestArray; public int testClassNum = 0; // 属性(get/set) public String getTestClassName() { return testClassName; } public void setTestClassName(String testClassName) { this.testClassName = testClassName; } public int getTestClassNum() { return testClassNum; } public void setTestClassNum(int testClassNum) { this.testClassNum = testClassNum; } // 构造器 public TestClass() { System.out.println("调用构造器TestClass()"); } public TestClass(String testClassName, int testClassNum) { this.testClassName = testClassName; this.testClassNum = testClassNum; System.out .println("调用构造器TestClass(String testClassName,int testClassNum)"); } // 方法 // 私有方法 private void privateMethod() { } // 保护方法 protected void protectedMethod() { } // 公有方法 public void TestClassMethod() { System.out.println("调用了TestClass类的void TestClassMethod()方法"); } public String TestClassMethod(String i) { System.out .println("调用了TestClass类的String TestClassMethod(String i)方法,传入的参数为"+ i); return i; } public void TestInterFace() { System.out.println("这是TestInterFace接口的实现"); } }
上面的类基本是照顾到了类的各个方面,除了内部类等。
说明:
(1)java.lang.reflect包中包含了反射的中使用的各种类。使用反射前需要导入。
(2) 若Class对象的方法名称中有Declared。则说明这个方法可以访问Class对象对应类的任意成员,无视访问权限(private,friendly,protected,public)。若没有则只能访问public的类成员。
(3)带Declared的方法破坏了oop的封装机制。
(4)若用反射调用类的方法,则无视多态的限制。可以没有限制的调用对象的运行时类型的方法。无视对象的编译时类型。这个在下篇文章中用代码阐述。
接下来看Java的反射。
首先,
通过反射获得类的相关信息。
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Reflect_to_get_ClassInformation { public static void main(String[] args) throws Exception { // 获得Class对象 System.out.println("获得Class对象"); // 方法1 Class c1 = Class.forName("TestClass"); System.out .println("方法1:使用Class.forName。如Class c=Class.forName(\"TestClass\");\t得到的Class对象为" + c1); // 方法2 Class c2 = TestClass.class; System.out .println("方法2:使用*(类).Class。如Class c2=TestClass.class;\t得到的Class对象为" + c2); // 方法3 TestClass testClassInstance = new TestClass(); Class c3 = testClassInstance.getClass(); System.out .println("方法3:使用*(实例).getClass()。如Class c3=testClassInstance.getClass();;\t得到的Class对象为" + c3); // 从Class对象中获取信息。 // 获取Class对象对应类的构造器Constructor对象 System.out.println(); System.out.println("获取Class对象对应类的构造器Constructor对象"); // 方法1 Constructor constructor1 = c1.getConstructor(); Constructor constructor2 = c1.getConstructor(String.class, int.class); System.out.println("方法1:Constructor constructor1=c1.getConstructor();\t获得有参数构造器:"+ constructor1); System.out.println(" :Constructor constructor2=c1.getConstructor(String.class,int.class);\t获得有参数构造器:"+ constructor2); // 方法2 Constructor[] constructor_array = c1.getConstructors(); System.out.println("方法2:Constructor[] constructor_array=c1.getConstructors();以数组的形式返回所有构造器\t得到构造器数组"); for (Constructor constructor : constructor_array) { System.out.println("\t\t\t构造器[]:" + constructor); } // 方法3 // 方法4 // 获取Class对象获取类的方法Method对象。 System.out.println(); System.out.println("获取Class对象获取类的方法Method对象。"); // 方法1 Method method1 = c1.getMethod("TestClassMethod"); Method method2 = c1.getMethod("TestClassMethod", String.class); System.out.println("方法1:返回TestClassMethod无参数method对象" + method1); System.out.println("\t ;返回TestClassMethod有参数method对象" + method2); // Method method3 = c1.getMethod("privateMethod"); // System.out.println("方法1:返回私有方法Method对象" + method3); System.out.println("该方法只能返回public方法Method对象,对private,protected则会报错。"); // 方法2 Method[] method_array = c1.getMethods(); System.out.println("方法2:以数组方式返回类的所有的方法method对象"); for (Method method : method_array) { System.out.println("\t\t\t方法:" + method); } //方法3 Method method3 = c1.getDeclaredMethod("privateMethod"); System.out.println("方法3:使用getDeclaredMethod().无视private,protected。返回私有方法Method对象" + method3); //方法4 Method[] method_all_array = c1.getDeclaredMethods(); System.out.println("方法4:getDeclaredMethods(),以数组方式返回类的所有的方法method对象,无视private,protected"); for (Method method4 : method_all_array) { System.out.println("\t\t\t方法[]:" + method4); } System.out.println(); // 获取Class对象对应类的字段Field对象。 System.out.println(); System.out.println("获取Class对象对应类的字段Field对象。"); // 方法1 Field field1 = c1.getField("testClassNum"); System.out.println("方法1 ;返回TestClassMethod中的Field对象" + field1); // Field field2 = c1.getField("testClassName"); // System.out.println("\t:返回TestClassMethod中的Field对象" + field2); System.out.println("该方法只能返回public字段Field对象,对private,protected则会报错。"); // 方法2 Field[] field_array = c1.getFields(); System.out.println("方法2:以数组方式返回类的所有的public字段Field对象"); for (Field field : field_array) { System.out.println("\t\t\t字段[]:" + field); } // 方法3 Field field3 = c1.getDeclaredField("testClassNum"); System.out.println("方法3:使用getDeclaredField()。该方法可以返回任意访问权限的字段。无视private,protected。返回TestClassMethod中的Field对象" + field3); // 方法4 Field[] field_all_array = c1.getDeclaredFields(); System.out.println("方法4:以数组方式返回类的所有的字段Field对象,无视private,protected。"); for(Field field4:field_all_array){ System.out.println("\t\t\t字段[]"+field4); } System.out.println(); // 获取Class对象对应类的 注释 对象。 System.out.println(); // 获取Class对象对应类的 内部类Class对象。 System.out.println(); // 获取Class对象对应类的 外部类Class对象。 System.out.println(); // 获取Class对象对应类所实现的接口。 System.out.println(); System.out.println("获取Class对象对应类所实现的接口Class对象。"); Class[] interface_array = c1.getInterfaces(); System.out.println("方法2:以数组方式返回类的所有的public字段Field对象"); for (Class inter : interface_array) { System.out.println("\t\t\t接口:" + inter); } System.out.println(); // 获取Class对象对应类的父类Class对象。 System.out.println(); System.out.println("获取Class对象对应类的父类Class对象。"); Class super_c = c1.getSuperclass(); System.out.println("方法1:Class super_c = c1.getSuperclass();所得到的父类Class对象的super_c为"+super_c); } }
通过反射实例化Class对象所对应类与方法调用。
import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Reflect_Operate_Class { public static void main(String[] args) throws Exception { //通过反射用Class对象实例化该对象对应类的实例。 System.out.println("通过反射用Class对象实例化该对象对应类的实例。"); Class c=Class.forName("TestClass"); //方法1 Object tc1=c.newInstance(); System.out.println("方法1:Class c=Class.forName(\"TestClass\");该方法只能调用默认无参数构造"); //方法2 Constructor constructor1=c.getConstructor(); Object tc2=constructor1.newInstance(); System.out.println("方法2.1:Constructor constructor1=c.getConstructor();TestClass tc2=(TestClass)constructor1.newInstance();"); Constructor constructor2=c.getConstructor(String.class,int.class);//注意到得到对应的构造器 TestClass tc3=(TestClass)constructor2.newInstance("构造器",100); System.out.println("方法2.2:Constructor constructor2=c.getConstructor();TestClass tc3=(TestClass)constructor1.newInstance(\"构造器\",100);构造器有参数实例化"); //调用Class所对应的类方法。 Object obj=c.newInstance(); Method method1=c.getMethod("TestClassMethod"); method1.invoke(obj); Method method2=c.getMethod("setTestClassNum",int.class); method2.invoke(obj,100); //访问属性 } }
以上的代码均通过运行。基本可以体现反射的一些基本用法了。等有什么新的东西,再更新吧。
发表评论
-
Java NIO 基础学习
2013-09-21 16:24 922零、概述 1、传统IO的问题 2、非阻塞IO ... -
try finally 与 return
2013-09-02 16:11 9531、try、catch、finally语句中,在如果try ... -
Java的传值
2013-07-21 13:06 942这个问题一直以来都有误区。本质原因是那些写书的人,喜欢用“传 ... -
Java多线程——synchronized的问题
2013-06-14 15:51 1036一直以来都存在这样的问题: 多线程操作同一对象。该对象有 ... -
Java与操作系统的交互
2013-05-05 22:08 1699System类 System表示Java程序的运行平台。S ... -
java枚举
2013-04-06 15:59 894枚举,之前一直忽视了其存在。其实挺有用。 java5 ... -
Java语法细节
2013-02-03 11:19 917final关键字 final修饰的量以视为常量,当fin ... -
Java Socket 学习笔记
2013-01-29 23:42 948Socket:英文中的意思是插座。 两个Java应用程序 ... -
Java 线程同步
2013-01-27 23:17 1028理解Java线程状态: ... -
Java 与 C# 计算性能比较
2012-11-02 14:51 1152程序:寻找2亿以内的最大素数,从2开始寻找。 Java程序: ... -
Java数组的操作
2012-10-12 11:23 843一、复制数组 java.lang.System类中的静态 ... -
Java容器
2012-10-09 00:33 877Java集合类就像容器。把多个对象的引用放进容器中。即集合类主 ... -
Java日期处理
2013-01-31 23:05 853不得不吐槽一下Java的日期处理。太不爽了。 基本 ... -
java:Excel
2012-09-27 09:06 1118jxl操作excel 在开源世界中,有两套比较有影响的API ... -
关于分页显示的页码
2012-08-21 13:30 1262分页显示数据时常常需要将页码列出来。 此处的Page类主要关 ... -
dom4j
2012-07-07 17:21 2235dom4j 与JDOM一样,也是一种用于解析XML文档 ... -
JDOM基础
2012-07-07 17:20 1934JDOM Java Document Object Mode ... -
线程优先级 && 后台线程 && join线程
2012-07-02 23:08 46线程优先级 每个线 ... -
Java线程的运行状态(线程的生命周期)
2012-07-02 22:56 892新建和就绪 ... -
Java多线程 Thread类 和 Runnable接口
2012-07-02 22:13 1513Java的线程,即一个Thre ...
相关推荐
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...
### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...
Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这个能力使得开发者可以突破静态类型的束缚,实现一些在编译时期无法完成...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...
### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...
### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...
### Java反射机制详解 #### 一、引言 在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时访问类的信息,并能够动态地创建对象、调用方法以及获取字段值等。这种能力对于框架设计、代码...