`

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反射的一个DEMO,适合初学者临摹学习,还附有properties的创建方法,比较基础。

    Java反射机制的使用和学习方法

    Java反射机制的使用和学习方法,从底层阐述Java反射机制的原理,让我们更加了解Java反射

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

    java之反射优化(缓存思路)源码 编程中,抽象是一个重要思想。一个无状态(业务less)的抽象化工具方法,往往可以起到减少代码量的作用,使得程序员能更加focus更加重要的业务逻辑中去

    JAVA反射机制详解视频

    (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并使用) (通过反射获取无参无返回值成员方法并使用) (通过反射获取带参带返回值成员...

    Java反射机制Demo

    基本的Java反射机制的用法和备注,易学易懂

    Java 反射封装 JavaBean

    使用 Java 反射封装 JavaBean &lt;br&gt; 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    java反射机制文档及代码

    java中的反射机制,pdf文档,常用的反射用法都有详细的说明。

    Java反射应用实例

    代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...

    java反射和动态代理

    java反射和动态代理,详细说明反射和动态代理的方法和使用!

    java反射机制demo

    给同事写的反射机制的用法,非常简单易用,大家一看就懂。也便于初学者对反射机制的理解 资源免费提供大家下载,如有疑问,可以直接咨询我

    java反射工具类

    java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符串方式输出。只是个工具类,没有写测试类,...

    Java反射demo

    Java反射的小例子,如何使用Java提供的API使用反射技术,操作类、属性、方法等。

    java反射jar包中class,并可进行文件比较

    java反射jar包中class,并可进行文件比较

    Java 反射读取配置文件及反射类

    这个工程是使用 java 来使用反射的原理读取 *.proproies 资源文件中的一些配置信息。利用此方法可以在没有使用框架的情况下可以让你的程序更加灵活易于修改。如:可以将一些数据库配置信息,重要信息写入到资源文件...

    Java反射机制.pptx

    Java反射机制,从WWW三个方面阐述(what:什么是Java反射 why:为什么会有Java反射 which:具体有哪些用法)比较全面

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    3.2 相关知识 3.2.1 Java反射机制的概念 3.2.2 反射机制的功能 3.2.3 Java反射机制的相关API 3.2.4 使用反射机制的步骤 3.2.5 反射机制的应用场景 3.2.6 反射机制的优缺点 Java高级程序设计实战教程第三章-Java反射...

    java_反射实战代码

    调用对象的方法,与直接在源代码中的交互是一样的,但又提供了额外的在运行时候的灵活性,但反射的一个最大的弊端就是性能比较差,相同的操作,用反射API所需的时间大概比直接使用慢一两个数量级,不过现在的JVM实现...

    java反射使用

    关于java反射的一些基本使用 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能...

Global site tag (gtag.js) - Google Analytics