java反射方法和使用详解
下文笔者讲述java反射方法的使用示例,如下所示
须先得到代表类的字节码的Class对象
Class类用于表示.class文件(字节码)
反射简介
反射机制: 对运行中的任意一个类 获取类的所有属性及方法 在java中,只要有类的名称,则可以使用反射机制获取类的所有信息例:反射的示例分享
public class Book { private Integer id; private String name; public Integer age; public Book() { System.out.println("Public 无参构造函数"); } public Book(String name) { System.out.println("Public 带参构造函数"); } private Book(String name,Double price){ System.out.println("Private 带两参构造函数"); } public void printAll(){ System.out.println("公开方法"); } private void printOne(){ System.out.println("私有方法"); } }
获取类的三种方式
使用反射须先得到代表类的字节码的Class对象
Class类用于表示.class文件(字节码)
方式1:使用Class.forName
使用 Class.forName(String classPath)时 请求参数classPath写需要反射的类名 一般是以包名.类名。 try { Class clz = Class.forName("com.entity.Book"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
方式2:使用类名.class
Class clz = Book.class;
方式3:对象.getClass()
Book book = new Book(); Class clz = book.getClass();
反射获取构造函数
getDeclaredConstructors(); 获取所有的构造函数 getDeclaredConstructor(参数类型); 获取一个指定参数类型的构造函数 getConstructors(); 获取所有公共的构造函数 getConstructor(参数类型); 获取一个指定参数类型的、public修饰的构造函数例:获取所有的构造函数
Constructor[] constructors = clz.getDeclaredConstructors(); //获取单个所有的构造函数 try { Constructor constructor = clz.getDeclaredConstructor(String.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } //获取所有的公开构造函数 Constructor[] constructors1 = clz.getConstructors(); //获取单个公开构造函数 try { Constructor constructor = clz.getConstructor(String.class); } catch (NoSuchMethodException e) { e.printStackTrace(); }
获取名字
返回类型:String,可以反射类名、方法名和构造函数名等等。 getName(); //获取全名 例如:com.bean.Book getSimpleName() //获取类名 例如:Book Class clz = Book.class; String name1 = clz.getName(); String name2 = clz.getSimpleName();
获取包
返回类型:Package Package aPackage = clz.getPackage();
获取接口
getInterfaces(), 返回类型:Class[] interfaces Class[] interfaces = clz.getInterfaces();
获取父类/超类
getSuperclass() 返回类型:Class superclass Class superclass = clz.getSuperclass();
实例化对象
语法糖:newInstance(Object initargs) 第一种方式 Class clz = Book.class; Object obj = clz.newInstance(); //将创建一个无参book对象 第二种方式 Class clz = Book.class; Constructor constructor = clz.getDeclaredConstructor(); //获得无参构造 Object obj = constructor.newInstance(); //实例化book对象
设置访问属性
clz.setAccessible(true) //可访问 clz.setAccessible(false) //不可访问 //默认是false Field id = clz.getField("age"); //age字段 id.setAccessible(true); //设为可访问 id.setAccessible(false); //设为不可访问
获取方法
getMethods():获取所有的公共方法,注意,它会将系统自带的方法也得到 getMethod(String name):获取单个公共方法,由参数指定方法名 getDeclaredMethods():获取所有的方法,注意:它不会获取系统自带的方法 getDeclaredMethod(String name):获取单个的所有方法 参数是可指定方法名 Class clz = Class.forName("Book"); Method[] methods = clz.getMethods(); //获取所有的公共方法 for (Method method : methods) { System.out.println(method.getName()); } Method method = clz.getMethod("printAll"); // 获取单个公共方法 method.invoke(clz.newInstance(), null); // 调用方法 Method[] methods = clz.getDeclaredMethods(); //获取所有方法 for (Method method1 : methods) { System.out.println(method1.getName()); } Method method1 = clz.getDeclaredMethod("printOne"); //获取单个公共方法 System.out.println(method1.getName());
调用方法
method.invoke(Object obj,Object... args) obj:如果是实例方法,则传入该方法的类对象;如果是静态方法,写null。 args:方法的参数值,没有写null,或不写都行 // 获取单个的public方法,无法获取private方法 Method method = clz.getMethod("printAll");
反射使用方法
method.invoke(clz.newInstance(),null);
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。