`

Java反射

阅读更多

反射(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反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    JAVA 反射机制应用

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

    java 反射得到某个方法

    在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...

    Java反射性能测试分析

    ### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java反射.pdf

    ### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这个能力使得开发者可以突破静态类型的束缚,实现一些在编译时期无法完成...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    java 反射 报错 no such method exception

    ### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....

    java反射获取所有属性,获取所有get方法,包括子类父类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...

    利用java反射将json字符串转成对象.zip

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    java反射

    ### Java反射机制详解 #### 一、引言 在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时访问类的信息,并能够动态地创建对象、调用方法以及获取字段值等。这种能力对于框架设计、代码...

Global site tag (gtag.js) - Google Analytics