欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > Java反射

Java反射

2024/11/8 9:54:41 来源:https://blog.csdn.net/WaaTong/article/details/143608065  浏览:    关键词:Java反射

动态代理


java.lang.reflect.Proxy:提供了为对象产生代理的方法:

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
  • loader:指定用哪个类加载器,去加载生成的代理类。
  • interfaces:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法。
  • h:指定生成的代理对象要干什么事。

案例:明星业务被经纪人代理

工程结构

被代理对象的类

public class BigStar implements IStar{private String name;public BigStar(){}public BigStar(String name){this.name = name;}@Overridepublic String sing(String name) {return name + "正在唱歌";}@Overridepublic String dance() {System.out.println(name + "正在跳舞");return name + "正在跳舞";}
}

代理的接口

public interface IStar {String sing(String name);String dance();
}

代理方法

public class ProxyUtil {public static IStar createProxy(BigStar bigStar){IStar proxyInstance = (IStar) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{IStar.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("sing")){System.out.println("准备话筒");}else if (method.getName().equals("dance")){System.out.println("准备场地");}return method.invoke(bigStar, args);}});return proxyInstance;}
}

测试

public class demo {public static void main(String[] args) {BigStar bigStar = new BigStar("sherry");IStar proxy = ProxyUtil.createProxy(bigStar);String sing = proxy.sing("小明");System.out.println(sing);proxy.dance();}
}

控制台

获取class对象的方式

  • Class.forName("全类名")
  • 类名.class
  • 对象.getClass

获取构造方法

利用反射获取构造方法
Class类中用于获取构造方法的方法
Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组 
Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>.. parameterTypes):返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>.. parameterTypes):返回单个构造方法对象Constructor类中用于创建对象的方法
TnewInstance(Object...initargs):根据指定的构造方法创建对象
setAccessible(boolean flag):设置为true,表示取消访问检查

获取成员变量

利用反射获取成员变量
Class类中用于获取成员变量的方法
Field[] getFields():返回所有公共成员变量对象的数组
Field[] getDeclaredFields():返回所有成员变量对象的数组
Field getField(String name):返回单个公共成员变量对象
Field getDeclaredField(String name):返回单个成员变量对象Field类中用于创建对象的方法
void set(Object obj, Object value):赋值
Object get(Object obj) 获取值。
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {Class<Student> aClass = Student.class;//1、获取公有的成员变量Field[] fields = aClass.getFields();for (Field field : fields) {System.out.println(field);}//2、获取所有的成员变量Field[] declaredFields = aClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}//3、获取单个成员变量Field sex = aClass.getField("sex");System.out.println(sex);Field name = aClass.getDeclaredField("name");System.out.println(name);//4、获取权限修饰符int modifiers = name.getModifiers();//4、获取成员变量名字String nameName = name.getName();//4、获取成员变量类型Class<?> type = name.getType();//5、获取成员变量对应的值Student student = new Student("女", "sherry", 18);name.setAccessible(true);Object value = name.get(student);System.out.println(value);//5、修改对象对应的值name.set(student, "张三");System.out.println(student);}

获取成员方法

利用反射获取成员方法Class类中用于获取成员方法的方法
Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
Method[]getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>... parameterTypes):返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>.. parameterTypes):返回单个成员方法对象Method类中用于创建对象的方法
Object invoke(Object obj, Object... args):运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)
  Class<Student> aClass = Student.class;//1、获取本类中公有的方法(包含父类中的公共方法)Field[] fields = aClass.getFields();for (Field field : fields) {System.out.println(field);}//2、获取本类中所有的方法(不包含父类中方法)Method[] declaredMethods = aClass.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod);}//3、获取指定方法Method eat = aClass.getMethod("eat", String.class);System.out.println(eat);//4、获取指定方法名String name = eat.getName();//5、获取指定方法的形参Parameter[] parameters = eat.getParameters();//6、获取指定方法的返回类型Class<?> returnType = eat.getReturnType();System.out.println(returnType);//7、获取指定方法的异常Class<?>[] exceptionTypes = eat.getExceptionTypes();Student student = new Student();eat.invoke(student, "汉堡包");

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com