Reflect反射练习

通过反射获得对象的成员变量,构造方法,方法

package Reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Scanner;
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { System.out.println("请输入完整的类名"); String string = new Scanner(System.in).nextLine(); //获取类对象 Class<?> c = Class.forName(string); //包名、类名 System.out.println(c.getPackage().getName());//包名 System.out.println(c.getName());//完整类名 System.out.println(c.getSimpleName());//简写类名 System.out.println("-----------成员变量----------"); f1(c); System.out.println("-----------构造方法----------"); f2(c); System.out.println("-----------方法----------"); f3(c); } private static void f1(Class<?> c) { /*获取所有的成员变量 * Field对象 封装变量的定义信息 * 定义信息包括:private static final String s:修饰符、类型、名称 * */ Field[] a = c.getDeclaredFields(); for (Field f : a) { //类型 String t = f.getType().getSimpleName(); //变量名 String n = f.getName(); } } private static void f2(Class<?> c) { /* * Constructor对象,封装构造方法定义的信息 * 构造方法定义信息包括: * public A(参数) throws异常 :修饰词、方法名、参数列表、异常四部分 * */ Constructor<?>[] a = c.getDeclaredConstructors(); for (Constructor<?> t : a) { //名称(类名) String n = c.getSimpleName(); //参数列表,类对象数组,得到的是Int/String类对象数组 Class<?>[] p = t.getParameterTypes(); System.out.println(Arrays.toString(p)); } } private static void f3(Class<?> c) { /*Method对象 封装方法定义的信息 * 方法定义信息有:public static Date f(参数) throws异常 : 修饰符、返回数据类型、方法名、参数列表、异常*/ Method[] a = c.getDeclaredMethods(); for (Method t : a) { //返回类型 String r = t.getReturnType().getSimpleName(); //方法名 String n = t.getName(); //参数列表 Class<?>[] p = t.getParameterTypes(); System.out.println(Arrays.toString(p)); } } }

 

通过反射获得对象实例:

package Reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Scanner;

public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println("输入完整类名 ");
        String aString = new Scanner(System.in).nextLine();
        Object o1=null;
        Object o2=null;
        //获得类对象
        Class<?> c = Class.forName(aString);
        //创建无参构造
        try {
            o1 = c.newInstance();
            System.out.println("创建了无参构造");
        } catch (Exception e) {
            System.out.println("没有无参构造");
        }
        
        //int 有参构造方法
        try {
            //获得int 参数构造方法
            Constructor<?> t = c.getConstructor(int.class);
            //xinji新建实例,并执行这个构造方法
            o2 = t.newInstance(5);
            System.out.println("新建int类型的构造方法实例");
        } catch (Exception e) {
            System.out.println("没有int参数的构造方法");
        }
        
        
        
    }
}

 

posted @ 2019-08-29 13:22  我爱si搬砖  阅读(147)  评论(0编辑  收藏  举报