Java反射用法
Posted inotebook
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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反射用法的主要内容,如果未能解决你的问题,请参考以下文章