`

Java反射用法

    博客分类:
  • java
 
阅读更多
反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。

package com.demo.reflectTest;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import com.mysql.jdbc.Driver;

public class Test {

	public static void main(String[] args) {

		try {
			Driver driver = new Driver();
			// 用法一:通过一个对象获得完整的包名和类名
			System.out.println(driver.getClass());
			// 用法二:实例化Class类的对象
			Class<?> class1 = Class.forName("com.mysql.jdbc.Driver");
			Class<?> class2 = new Driver().getClass();
			Class<?> class3 = Driver.class;
			System.out.println(class1.getName());
			System.out.println(class2.getName());
			System.out.println(class3.getName());
			// 用法三:通过Class实例化其他无参构造类的对象
			Class<?> user = Class.forName("com.demo.reflectTest.User");
			User u = null;
			u = (User) user.newInstance();
			System.out.println(user.equals(u));
			// 用法四:通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)
			Constructor<?> cons[] = user.getConstructors();
			System.out.println(cons[0].getModifiers() + " "
					+ cons[0].toGenericString());
			User u0 = (User) cons[0].newInstance("root", "123456", 20);
			System.out.println(cons[1].getModifiers() + " "
					+ cons[1].toGenericString());
			User u1 = (User) cons[1].newInstance("admin", 23);
			System.out.println(cons[2].getModifiers() + " "
					+ cons[2].toGenericString());
			User u2 = (User) cons[2].newInstance("temp");
			// 用法五:返回一个类实现的接口
			Class<?> ins[] = user.getInterfaces();
			for (Class<?> c : ins) {
				System.out.println(c.getName());
			}
			// 用法六:取得其他类中的父类
			System.out.println(user.getSuperclass());
			// 用法七:获得类的属性
			Field[] field = user.getDeclaredFields();
			for (Field f : field) {
				System.out.print(Modifier.toString(f.getModifiers()) + " ");
				System.out.print(f.getType() + " ");
				System.out.print(f.getName() + " ");
				System.out.println();
			}
			// 用法八:通过反射调用其他类中的方法(JDK动态代理)
			Method method = user.getMethod("sayHello");
			method.invoke(user.newInstance());
			method = user.getMethod("sayWords", String.class);
			method.invoke(user.newInstance(), "World");
			// 用法九:调用其他类的set和get方法
			u = (User) user.newInstance();
			setter(u, "Password", "654321", String.class);
			getter(u, "Password");
			// 用法十:通过反射操作属性
			u = (User) user.newInstance();
			Field fd = user.getDeclaredField("username");
			fd.setAccessible(true);
			fd.set(u, "guest");
			System.out.println(fd.get(u));
			// 用法十一:通过反射取得并修改数组的信息
			int[] a = { 5, 4, 3, 2, 1, 0 };
			Class<?> array = a.getClass().getComponentType();
			System.out.println(array.getName());
			System.out.println(Array.getLength(a));
			System.out.println(Array.get(a, 2));
			Array.set(a, 0, 7);
			System.out.println(Array.get(a, 0));
			// 用法十二:通过反射修改数组大小
			int b[] = { 1, 2, 3, 4 };
			int newB[] = (int[]) arrayInc(b, 8);
			System.out.println(Arrays.toString(newB));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static Object arrayInc(Object o, int length) {
		// TODO 自动生成的方法存根
		Class<?> arr = o.getClass().getComponentType();
		Object newO = Array.newInstance(arr, length);
		int oldLength = Array.getLength(o);
		System.arraycopy(o, 0, newO, 0, oldLength);
		return newO;
	}

	private static void getter(Object o, String att) {
		// TODO 自动生成的方法存根
		try {
			Method method = o.getClass().getMethod("get" + att);
			System.out.println(method.invoke(o));
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

	private static void setter(Object o, String att, Object value, Class<?> type) {
		// TODO 自动生成的方法存根
		Method method;
		try {
			method = o.getClass().getMethod("set" + att, type);
			method.invoke(o, value);
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    java 反射得到某个方法

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

    java反射 java反射 java反射java反射

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

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

    本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...

    Java方法反射调用demo

    本示例将深入探讨如何使用Java反射进行各种方法的调用。 首先,让我们从调用无参数的方法开始。在Java中,我们可以通过`Class`对象的`getMethod`方法获取到指定的公共方法,然后通过`invoke`方法调用它。例如: ``...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    Java反射调用方法

    在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...

    Java反射性能测试分析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...

    java 反射的使用

    以下是对Java反射使用及相关知识点的详细阐述: 1. **获取Class对象** - `Class.forName(String className)`: 通过全限定类名获取Class对象。 - `object.getClass()`: 对象的`getClass()`方法返回该对象的Class...

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

    以下是如何使用Java反射来调用私有方法并获取私有属性值的详细步骤: 1. **获取Class对象**:首先,我们需要获取到目标类的Class对象,这可以通过`Class.forName()`方法或者对象的`getClass()`方法来实现。例如,...

    Java反射机制总结

    以下是一个简单的Java反射示例,展示了如何使用反射来获取类的信息: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.for...

    Java 反射创建get set方法及反射方法的调用

    本文介绍了如何使用Java反射机制来创建get和set方法,并通过反射调用这些方法来访问对象的属性。这种方式虽然灵活,但在实际开发中应当谨慎使用,因为它可能会降低代码的性能和可维护性。了解反射机制的基本原理对于...

    java面试题--反射机制

    下面通过一个简单的示例展示如何使用Java反射机制: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionDemo { public ...

    Java反射经典实例

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

    反射实例-JAVA反射机制

    在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...

    java反射机制应用

    ### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...

    java之反射优化(缓存思路)源码

    在Java编程中,反射(Reflection)是一个强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。然而,反射操作通常比直接的Java代码执行慢,因为它涉及到动态类型检查和方法调用。因此,为了提高性能,...

    java反射源代码

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

    java反射.pdf

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

Global site tag (gtag.js) - Google Analytics