`

Java基础四: 反射(构造方法,成员变量,普通方法,数组)

阅读更多
/**
 * 反射(构造方法,成员变量,普通方法,数组)
 * 
 * @author 张明学
 * 
 */
public class ReflectStudy {
	@SuppressWarnings("unused")
	public static void main(String[] args) throws Exception {

 

		System.out.println("--------1. 构造方法反射-------");
		Class strClass = String.class;
		Constructor[] constr = strClass.getConstructors();
		// String的所有构造方法
		for (Constructor constructor : constr) {
			System.out.println("构造方法参数个数:" + constructor.getParameterTypes().length);
			for (Class c : constructor.getParameterTypes()) {
				System.out.print(c.getName() + "\t");
			}
			System.out.println();
		}
		// 获取构造方法
		Constructor constructor = String.class.getConstructor(StringBuffer.class);
		String str1 = (String) constructor.newInstance(new StringBuffer("abc"));
		System.out.println(str1.charAt(1));
		// Class对象的newInstance()方法是对无参的构造方法的调用
		String s1 = String.class.newInstance();
		String s2 = new String();
		System.out.println(s1.toString());
		System.out.println(s2.toString());

 

输出结果:

--------1. 构造方法反射-------
构造方法参数个数:3
[C	int	int	
构造方法参数个数:3
[I	int	int	
构造方法参数个数:4
[B	int	int	int	
构造方法参数个数:2
[B	int	
构造方法参数个数:1
[C	
构造方法参数个数:1
java.lang.String	
构造方法参数个数:2
[B	java.lang.String	
构造方法参数个数:3
[B	int	int	
构造方法参数个数:1
[B	
构造方法参数个数:1
java.lang.StringBuffer	
构造方法参数个数:1
java.lang.StringBuilder	
构造方法参数个数:4
[B	int	int	java.lang.String	
构造方法参数个数:0

b

 

		System.out.println("--------2. 成员变量反射-------");
		// 获得成员变量(注:成员变量属于Class所有不属于某个对象)
		// public类型的可以直接获取
		Field filedX = Point.class.getField("x");
		// private类型的要通用getDeclaredField()方法获取
		Field filedY = Point.class.getDeclaredField("y");
		Point p = new Point(3, 7);
		// 获取成员变量的值(必须属于某个对象)
		System.out.println(filedX.get(p));// public类型可以直接获取
		// private类型要设置setAccessible(true)才能获取变量值
		filedY.setAccessible(true);
		System.out.println(filedY.get(p));

		System.out.println(p);
		changeStringValue(p);
		System.out.println(p);

 

--------2. 成员变量反射-------
3
7
Point对象的值:str1 = abc str2 = abcabc str3 = ac
Point对象的值:str1 = Bbc str2 = BbcBbc str3 = Bc

 

		System.out.println("--------3. 方法反射-------");
		// Method也是属于Class所有
		Method charAtMethod = String.class.getMethod("charAt", int.class);
		// Method的调用必须属于某个对象:invoke(对象,参数...)
		// invoke(null, 参数...)表示调用的静态方法
		String s = new String("abc");
		System.out.println(charAtMethod.invoke(s, 2));
		// 静态调用
		TestArguments.main(new String[] { "111", "222", "333" });
		// 类名由main(String[] args)方法中的第一个参数指定
		if (args.length > 0) {
			String startingClassName = args[0];
			Method startdMainMethod = Class.forName(startingClassName)
					.getMethod("main", String[].class);
			// main为静态方法
			startdMainMethod.invoke(null, (Object) new String[] { "aaa", "bbb",
					"ccc" });
			// 或
			startdMainMethod.invoke(null, new Object[] { new String[] { "aaa",
					"bbb", "ccc" } });
		}

 

--------3. 方法反射-------
c
111
222
333
aaa
bbb
ccc
aaa
bbb
ccc

 

		System.out.println("--------4. 数组反射-------");
		int[] a1 = new int[3];
		int[] a2 = new int[6];
		int[][] a3 = new int[3][3];
		String[] a4 = new String[3];
		// ******数组的反射:维数和类型相同的数组的Class是相同的****** \\
		System.out.println(a1.getClass() == a2.getClass());// true
		System.out.println(a1.getClass() == a3.getClass());// true
		System.out.println(a1.getClass() == a4.getClass());// true

		// 数组可以转换成Object
		Object o1 = a1;
		Object o2 = a3;
		Object o3 = a4;
		// 基本数据类型的数组不能转换成Object[],复杂数据类型的数组可以转换成Object[]
		// Object[] o4 = a1;
		Object[] o5 = a3;
		Object[] o6 = a4;
		// Arrays工具类
		a1 = new int[] { 1, 2, 3 };
		a4 = new String[] { "a", "b", "c" };
		System.out.println(Arrays.asList(a1));// 显示:[[I@9cab16]
		System.out.println(Arrays.asList(a4));// 显示:[a, b, c]

		printObject(a4);
		printObject("abc");

	}

 

--------4. 数组反射-------
true
false
false
[[I@9cab16]
[a, b, c]
a
b
c
abc

 

	private static void printObject(Object obj) {
		Class clazz = obj.getClass();
		if (clazz.isArray()) {
			int len = Array.getLength(obj);
			for (int i = 0; i < len; i++) {
				System.out.println(Array.get(obj, i));
			}
		} else {
			System.out.println(obj);
		}
	}

	/**
	 * 修改一个对象里的为String类型成员变量的属性值(将a换成B)
	 * 
	 * @param p
	 * @throws
	 * @throws Exception
	 */
	private static void changeStringValue(Point p) throws Exception {
		Field[] fileds = p.getClass().getDeclaredFields();
		for (Field field : fileds) {
			// 任何类型的Class只有一份
			if (field.getType() == String.class) {
				String filedValue = (String) field.get(p);
				String newValue = filedValue.replace("a", "B");
				field.set(p, newValue);
			}
		}
	}

}

class TestArguments {

	public static void main(String[] args) {
		for (String arg : args) {
			System.out.println(arg);
		}
	}
}

  所用的Point类如下:

public class Point {
	public int x;

	private int y;

	public String str1 = "abc";

	public String str2 = "abcabc";

	public String str3 = "ac";

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString() {
		return "Point对象的值:str1 = " + str1 + " str2 = " + str2 + " str3 = "
				+ str3;
	}
}

 

3
2
分享到:
评论
1 楼 mopishv0 2011-01-27  
    System.out.println(a1.getClass() == a2.getClass());// true  
    System.out.println(a1.getClass() == a3.getClass());// true  
    System.out.println(a1.getClass() == a4.getClass());// true  


JDK1.6下编译不过
改成这样
        Class a1C = a1.getClass();
        Class a2C = a2.getClass();
        Class a3C = a3.getClass();
        Class a4C = a4.getClass();
        // *****比较结果****** \\  
        System.out.println(a1C == a2C);// true  
        System.out.println(a1C == a3C);// false  
        System.out.println(a1C == a4C);// false  
        System.out.println(a3C == a4C);// false  

相关推荐

    JAVA基础--JAVA中的反射机制详解

    JAVA 反射机制详解 JAVA 反射机制是 Java 语言中... Java 反射机制提供了一个强大的功能,可以在运行时动态获取类的信息、构造对象、获取成员变量和方法、调用对象的方法等。这样可以大大提高程序的灵活性和扩展性。

    java反射全解(反射原理+反射API详解+反射与数组+反射与泛型+反射源码与性能开销+反射优缺点+反射与内省)

    通过反射机制,可以在运行时判断任意一个对象所属的类、构造任意一个类的对象、判断任意一个类所具有的成员变量和方法、调用任意一个对象的方法。 反射机制的原理是基于类加载的流程。类加载的完整过程包括编译、...

    JAVA基础-反射-枚举

    ### JAVA基础-反射-枚举知识点详解 #### 一、反射概述 反射是Java语言提供的一种能在运行时分析类和对象的能力。通过反射,我们可以在程序运行时动态地获取类的信息(如类名、方法、构造函数等)并操作这些信息。 ...

    Java应用基础:网友精选25个Java试题分享

    1. **Java基础语法**:这部分可能包括变量声明、数据类型(如基本类型和引用类型)、运算符(算术、比较、逻辑、位运算等)、流程控制语句(如if、switch、for、while)以及方法定义与调用。 2. **类与对象**:试题...

    Java反射机制2

    在“Java反射机制2”这个主题中,我们将深入探讨数组与Object的关系、成员方法的反射、成员变量的反射以及数组的反射应用。 1. 数组与Object的关系及其反射类型: 在Java中,所有数组都继承自Object类,这意味着...

    java反射知识点

    2.获取构造方法并调用 3.获取成员方法 4.获取成员变量 5.反射数组 6.通过反射配置文件内容 7.通过反射越过泛型检查 8.其他一些文本笔记 读者需要补充的知识点我来说一下,补充: 1.反射数组应用 2.反射main方法 3....

    Java基础学习教程(附PPT和源代码)

    配置eclispe的编译与运行环境rar在eclispe中配置java模板代码.rar在eclipse中导入已有的工程.rarjava5的静态导入与...对接收数组参数的成员方法进行反射....数组与Object的关系及其反射类型.rar数组的反射应用.rar

    Java反射调用方法

    Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息,包括但不限于获取类的方法、字段、构造器等,并能动态调用方法和修改字段值。这个特性使得Java具有了更...

    Java反射机制笔记(简单易懂)

    通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态地调用这些成员变量和方法。 获取Class对象 ---------------- 在Java中,Class对象是反射机制的基础。我们可以...

    怎样用Jvm处理Java数组.doc

    使用反射技术可以观察到,数组的类(例如`[I`)实际上继承自`java.lang.Object`类,并且自身没有声明任何成员变量、成员方法、构造函数或注解。这意味着数组类本身非常简单,仅继承了基本的属性和方法。 3. **数组...

    Java语言的反射机制

    Java反射机制主要提供了以下几项核心功能: 1. **动态获取类信息**:可以在运行时判断任意一个对象所属的类,包括该类的所有属性和方法。 2. **动态创建对象**:在运行时可以构造任意一个类的对象,这通常用于框架...

    Java反射常用机制

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这个特性使得Java代码能够具备高度的动态性,能够在未知类结构的情况下进行操作,增强了程序的灵活性。在Java中...

    Java基础第一章_withMarginNotes.pdf

    * 类和类的成员:属性、方法、构造器、代码块 * 关键字:四大权限修饰符、abstracted等 第3部分:Java SE高级应用程序 * 异常:exception * 集合:ArrayList、HashMap、HashSet * I/O流:input和output * 多线程:...

    Java综合面试资料集

    2. 构造方法:构造方法是类的初始化方法,它用于初始化类的成员变量。 3. 静态变量和实例变量的区别:静态变量是类的成员变量,实例变量是对象的成员变量。 内部类知识点: 1. 内部类:内部类是定义在另一个类中的...

    JAVA程序员必读:基础篇

    13. **反射**:Java反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于框架和元编程非常重要。 14. **注解**:注解(Annotation)为代码提供了元数据,有助于编译器和构建工具进行代码检查、生成代码或...

    java反射机制.pdf

    Java反射机制是Java编程语言中的一个重要特性,它赋予了程序在运行时检查和操作类、对象、字段和方法的能力。这种动态性使得Java能够在运行时分析和修改代码,增加了编程的灵活性和多样性。 1. **Java反射机制核心...

    java反射机制PPT

    Java反射机制是Java编程语言中一项强大的工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。反射机制的核心在于能够在运行时动态地获取类的信息,并且可以动态调用对象的方法,创建对象,甚至修改对象...

Global site tag (gtag.js) - Google Analytics