Java反射的基本应用
Posted 听风者-better
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射的基本应用相关的知识,希望对你有一定的参考价值。
Java反射的基本应用
参考文章:
https://blog.csdn.net/sinat_38259539/article/details/71799078
一.反射机制概述
JAVA反射机制是在运行状态中,对于任意一个类,能够获取这个类的所有属性和方法,对于任意一个对象,能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
总结:反射就是把java类中的各种成分映射成一个个的Java对象
二、反射的优缺点
- 优点:
- 使用反射,我们就可以在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
- 缺点:
- 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射。
- 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
三、反射的基本使用
-
class
package com.twy.test; import java.lang.reflect.Constructor; import com.twy.entity.User; public class ClassTest public static void main(String[] args) throws Exception //一.获取class类 User u1 = new User();//已经 Class<?> c1 = u1.getClass(); System.out.println(c1.getName()); Class<?> c2 = User.class; System.out.println(c2.getName()); //常用方法 try Class<?> c3 = Class.forName("com.twy.entity.User"); System.out.println(c3.getName()); catch (ClassNotFoundException e) e.printStackTrace(); //二.创建实例 //1.使用Class对象的newInstance()方法 Class<?> c = User.class; Object o1 = c.newInstance(); System.out.println(o1); //2.通过Class对象获取指定的Constructor构造器对象,根据构造器创建实例 Constructor<?> constructor= c.getConstructor(); Object o2 = constructor.newInstance(); System.out.println(o2);
User类:
package com.twy.entity; public class User public Integer id; private String name; private int age; private boolean login; public User() public User(int id) super(); this.id = id; private User(String name) super(); this.name = name; private User(String name, int age, boolean login) super(); this.name = name; this.age = age; this.login = login; public User(int id, String name, int age, boolean login) super(); this.id = id; this.name = name; this.age = age; this.login = login; public void test(int id, String name) System.out.println("test方法被调用"); private void add() System.out.println("add方法被调用"); public Integer getId() return id; public void setId(Integer id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public int getAge() return age; public void setAge(int age) this.age = age; public boolean isLogin() return login; public void setLogin(boolean login) this.login = login;
-
method
package com.twy.test; import java.lang.reflect.Method; public class MethodTest public static void main(String[] args) throws Exception Class<?> clazz = Class.forName("com.twy.entity.User"); //获取公有方法包括父类 Method[] mArr1 = clazz.getMethods(); for(Method m: mArr1) System.out.println(m); //获取所有方法包含私有方法 Method[] mArr2 = clazz.getDeclaredMethods(); for(Method m: mArr2) System.out.println(m); //获取单个公有方法 Method m = clazz.getMethod("test", int.class,String.class); System.out.println(m); Object obj = clazz.newInstance(); m.invoke(obj, 1,"测试"); //获取单个方法包含私有方法 Method pm = clazz.getDeclaredMethod("add"); System.out.println(pm); Object obj2 = clazz.newInstance(); pm.setAccessible(true); pm.invoke(obj2);
-
filed
package com.twy.test; import java.lang.reflect.Field; import com.twy.entity.User; public class FieldTest public static void main(String[] args) throws Exception Class<?> clazz = Class.forName("com.twy.entity.User"); //获取所有公有字段 Field[] fArr = clazz.getFields(); for(Field f : fArr) System.out.println(f); //获取所有字段包含私有字段 Field[] fArr2 = clazz.getDeclaredFields(); for(Field f : fArr2) System.out.println(f); //获取单个公有字段 Field f = clazz.getField("id"); Object obj = clazz.newInstance(); f.set(obj, 1); System.out.println(((User) obj).getId()); //获取单个字段包含私有字段 Field pf = clazz.getDeclaredField("name"); Object obj2 = clazz.newInstance(); pf.setAccessible(true); pf.set(obj2, "测试"); System.out.println(((User) obj2).getName());
-
通过反射调用set/get方法
package com.twy.test; import java.lang.reflect.Field; import java.lang.reflect.Method; import com.twy.entity.User; public class ReflectUtil public static Object getMethod(Object obj, String args) throws Exception Class<?> clazz = obj.getClass(); Field field = clazz.getDeclaredField(args); if (field == null) return null; String fieldName = "get" + args.substring(0, 1).toUpperCase() + (args.length() > 1 ? args.substring(1) : ""); Method m = clazz.getDeclaredMethod(fieldName); return m.invoke(obj); public static void setMethod(Object obj, String args, Object value) throws Exception Class<?> clazz = obj.getClass(); Field field = clazz.getDeclaredField(args); if (field == null) return; String fieldName = "set" + args.substring(0, 1).toUpperCase() + (args.length() > 1 ? args.substring(1) : ""); Method m = clazz.getDeclaredMethod(fieldName,value.getClass()); m.invoke(obj, value); public static void main(String[] args) User user = new User(); try int a = 1; ReflectUtil.setMethod(user, "id", a); int id = (int) ReflectUtil.getMethod(user, "id"); ReflectUtil.setMethod(user, "name", "哈哈哈"); String name = (String) ReflectUtil.getMethod(user, "name"); System.out.println(id); System.out.println(name); catch (Exception e) e.printStackTrace();
以上是关于Java反射的基本应用的主要内容,如果未能解决你的问题,请参考以下文章