java反射

来源:互联网 发布:男士护肤 知乎 编辑:程序博客网 时间:2024/06/06 00:43
package com.demo.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, Exception {/** * 反射:解剖类的内容 * 所有类都是Class类的对象,Class类包含Field、Method、Constructor类型的属性 * 反射的步骤: *  1.获得类 *  2.构造方法+获取实例 *  3.属性 *  4.方法 *//*-----------1.获取类的三种方式--------*/System.out.println("-----------1.获取类的三种方式--------");Class clazz=a3("com.demo.reflect.Helper");/*-----------2.构造方法+获取实例---------*/getConstructor(clazz);/*-----------3.属性---------*/getField(clazz);/*-----------4.方法---------*/getMethod(clazz);}/** * 获取类的三种方式 * a1.通过对象的getClass方法 需要  类 对象 对象的方法 * a2.通过类的class静态方法  需要   类 类的静态方法 * a3.通过Class的forName方法  只需知道类的字符串 可以灵活使用 * @return Class */public static Class a3(String className) throws ClassNotFoundException{// 对象的getClass方法 需要  类 对象 对象的方法Helper demo = new Helper();Class c1=demo.getClass();System.out.println("对象的getClass方法 需要  类 对象 对象的方法--->"+c1);// 类的class静态方法  需要   类 类的静态方法Class c2=Helper.class;System.out.println("类的class静态方法  需要   类 类的静态方法--->"+c2);//对象的Class.forName方法  只需知道类的字符串 可以灵活使用Class c=Class.forName(className);System.out.println("对象的Class.forName方法  只需知道类的字符串 可以灵活使用--->"+c);return c;}/** * 构造方法+获取实例 * @param clazz * @throws ClassNotFoundException * @throws InstantiationException * @throws Exception */public static void getConstructor(Class clazz) throws ClassNotFoundException, InstantiationException, Exception{//1.一般方式 获取公共无参的构造方法Object o=clazz.newInstance();System.out.println("1.一般方式 获取公共无参的构造方法"+o);//2.当未提供无参构造方法或无参构造方法被私有怎么办?System.out.println("当未提供无参构造方法或无参构造方法被私有怎么办?");//获取所有公共构造方法[本类的  父类的]Constructor[] cs = clazz.getConstructors();System.out.println("获取所有公共构造方法[本类的 ]");for(Constructor c:cs){System.out.println(c);}//获取本类所有构造方法Constructor[] cs2 = clazz.getDeclaredConstructors();System.out.println("获取本类所有构造方法");for(Constructor c:cs2){System.out.println(c);}//获取指定构造方法//无参构造方法Constructor c1 = clazz.getConstructor(null);Object o1=c1.newInstance(null);//有参构造方法Constructor c2 = clazz.getConstructor(String.class,int.class);Object o2=c2.newInstance("ww",5);}/** * 获取属性 * @param clazz * @throws Exception * @throws SecurityException */public static void getField(Class clazz) throws Exception, SecurityException {//获取所有公共属性[本类的  父类的]Field[] fs = clazz.getFields();System.out.println("获取所有公共属性[本类的  父类的]");for(Field c:fs){System.out.println(c);}//获取本类所有属性Field[] fs2 = clazz.getDeclaredFields();System.out.println("获取本类所有属性");for(Field c:fs2){System.out.println(c);}//获取指定属性[只能是公共的]Field f1 = clazz.getField("name");System.out.println("获取指定属性[只能是公共的]"+f1);//获取指定属性[只能是公共的]Field f2 = clazz.getDeclaredField("age");System.out.println("获取指定属性[忽略属性 可以是私有的]"+f2);//给属性赋值Object object=clazz.newInstance();f1.set(object, "hjsh");//给私有属性赋值要先通过字段设置类f2.setAccessible(true);f2.set(object, 15);System.out.println(object.toString());}/** * 方法 * @param clazz * @throws Exception * @throws Exception */public static void getMethod(Class clazz) throws Exception, Exception {//获取所有公共方法[本类的  父类的]Method[] cs = clazz.getMethods();System.out.println("获取所有公共方法[本类的  父类的]");for(Method c:cs){System.out.println(c);}//获取本类所有方法Method[] cs2 = clazz.getDeclaredMethods();System.out.println("获取本类所有方法");for(Method c:cs2){System.out.println(c);}//获取指定方法Method m = clazz.getDeclaredMethod("toString", null);System.out.println("获取指定方法->"+m);System.out.println("调用方法");Object obj = clazz.newInstance();System.out.println(m.invoke(obj, null));}}


原创粉丝点击