反射的使用

概述

    JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    每个类都会产生一个对应的Class对象,也就是保存在.class文件。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。

     Class 类与 java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了 Field,Method,Constructor 类 (每个类都实现了 Member 接口)。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。

使用

首先创建几个测试类和接口:

/**
 * Hello world!
 *
 */
public class App
{

    private Integer weight;
    private Integer height;

    public App(Integer weight, Integer height) {
        super();
        this.weight = weight;
        this.height = height;
    }

    public App() {
        super();
    }

    @Override
    public String toString() {
        return "App [weight=" + weight + ", height=" + height + "]";
    }

}

/*
 * @author zzf
 * @date 2018年11月6日 下午2:18:39
 */
public interface InterfaceA {

}
/*
 * @author zzf
 * @date 2018年11月6日 下午2:44:32
 */
public class U {

    private String type;

    public U(String type) {
        super();
        this.type = type;
    };
    public U() {
        super();
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    };

}

/*
 * @author zzf
 * @date 2018年11月6日 上午11:00:55
 */
public class User extends U{

    private String name;
    private Integer age;
    public App app;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public App getApp() {
        return app;
    }
    public void setApp(App app) {
        this.app = app;
    }
    public User(String name, Integer age, App app) {
        super();
        this.name = name;
        this.age = age;
        this.app = app;
    }
    public User(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    private User(String name) {
        super();
        this.name = name;
    }
    public User() {
        super();
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", app=" + app + "]";
    }
    private String aaa() {
        return "User [name=" + name + ", age=" + age + ", app=" + app + "]";
    }

    public String User(String name, Integer age, App app) {
        this.name = name;
        this.age = age;
        this.app = app;
        return toString();
    }
    private class P {
        private String p;

        public P(String p) {
            super();
            this.p = p;
        }

        public String getP() {
            return p;
        }

        public void setP(String p) {
            this.p = p;
        }

    }
}

测试demo:


import java.lang.reflect.*;

/*
 * @author zzf
 * @date 2018年11月6日 上午10:57:31
 */
public class Text {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
        //返回与给定字符串名称的类或接口相关联的类对象。
        //三种方式
        Class user=Class.forName("reflect.User");
        System.out.println(user.toGenericString());//public class reflect.User
        Class app=User.class;
        System.out.println(app.toGenericString());//public class reflect.User
        System.out.println(new User().getClass().toGenericString());//public class reflect.User

        //返回类的限定符,在toGenericString源码中可寻
        int modifiers = app.getModifiers() & Modifier.classModifiers();
        String s=Modifier.toString(modifiers);
        System.out.println(s);//public

        //创建一个User类的实例
        Object userObj=Class.forName("reflect.User").newInstance();//默认构造器
        System.out.println((User)userObj);//User [name=null, age=null, app=null]
        //判断实例是否为该类
        System.out.println(user.isInstance(new User()));//true
        //是否是该class对象
        System.out.println(user.isAssignableFrom(User.class));//true


        //判断该反射对象是否是接口
        System.out.println("接口:"+Class.forName("reflect.InterfaceA").isInterface());//true
        System.out.println("类:"+Class.forName("reflect.User").isInterface());//true

        //判断指定的类对象是否表示基元类型
        System.out.println(int.class.isPrimitive());//true
        System.out.println(User.class.isPrimitive());//false

        //打印类的全限定名
        System.out.println(Class.forName("reflect.User").getName());//reflect.User
        System.out.println(User.class.getName());//reflect.User

        //获取类加载器
        System.out.println("类加载器:"+Class.forName("reflect.User").getClassLoader());//sun.misc.Launcher$AppClassLoader@18b4aac2

        //获取它的超类对象
        System.out.println(Class.forName("reflect.User").getSuperclass());//class reflect.U
        System.out.println(Class.forName("reflect.User").getGenericSuperclass());//class reflect.U

        //获取它的包名
        System.out.println("包:"+Class.forName("reflect.User").getPackage());//包:package reflect

        //返回类修饰符所对应的int值,在Modifier类中可寻
        System.out.println(Class.forName("reflect.User").getModifiers());//1

        //返回类名
        System.out.println(Class.forName("reflect.User").getSimpleName());//User
        System.out.println(Class.forName("java.lang.String").getSimpleName());//String


        //根据类反射字段,方法,构造器等,public标识符
        Field[] field=Class.forName("reflect.User").getFields();//app,
        for(Field f:field)
            System.out.print(f.getName()+",");
        System.out.println();
        Method[] method=Class.forName("reflect.User").getMethods();//toString,getName,setName,User,getAge,setAge,getApp,setApp,getType,setType,wait,wait,wait,equals,hashCode,getClass,notify,notifyAll,
        for(Method f:method)
            System.out.print(f.getName()+",");
        System.out.println();
        Constructor<?>[] constructor=Class.forName("reflect.User").getConstructors();//reflect.User|2:class java.lang.String,class java.lang.Integer,reflect.User|0:reflect.User|3:class java.lang.String,class java.lang.Integer,class reflect.App,
        for(Constructor f:constructor){
            System.out.print(f.getName()+"|"+f.getParameterCount()+":");
            for (Parameter p:f.getParameters()){
                System.out.print(p.getType()+",");
            }
        }
        System.out.println();

        //获取单个字段或者方法或者构造器,public
        Field f=Class.forName("reflect.User").getField("app");//public reflect.App reflect.User.app
        System.out.println(f);
        Method m=Class.forName("reflect.User").getMethod("toString");//public java.lang.String reflect.User.toString()
        System.out.println(m);
        Constructor con=Class.forName("reflect.User").getConstructor();//User [name=null, age=null, app=null]
        System.out.println(con.newInstance());
        Constructor con2=Class.forName("reflect.User").getConstructor(String.class,Integer.class);//User [name=1111, age=11, app=null]
        System.out.println(con2.newInstance("1111",11));


        //返回所有的字段,方法,或者构造器
        //返回成员类
        Class<?>[] dec=Class.forName("reflect.User").getDeclaredClasses();//reflect.User$P,
        for(Class text:dec)
            System.out.print(text.getName()+",");
        System.out.println();
        Field[] fie=Class.forName("reflect.User").getDeclaredFields();//返回所有的字段:name,age,app,
        for(Field text:fie)
            System.out.print(text.getName()+",");
        System.out.println();
        Method[] met=Class.forName("reflect.User").getDeclaredMethods();//返回所有方法:toString,getName,setName,aaa,User,getAge,setAge,getApp,setApp,
        for(Method text:met)
            System.out.print(text.getName()+",");
        System.out.println();
        Constructor<?>[] cons=Class.forName("reflect.User").getDeclaredConstructors();//返回所有构造器:app|2:class java.lang.String,class java.lang.Integer,app|1:class java.lang.String,app|0:app|3:class java.lang.String,class java.lang.Integer,class reflect.App,
        for(Constructor text:cons){
            System.out.print(f.getName()+"|"+text.getParameterCount()+":");
            for (Parameter p:text.getParameters()){
                System.out.print(p.getType()+",");
            }
        }
        System.out.println();

        //返回任意字段,方法,构造器,包括私有
        Field df=Class.forName("reflect.User").getDeclaredField("name");//private java.lang.String reflect.User.name
        System.out.println(df);
        Method dm=Class.forName("reflect.User").getDeclaredMethod("aaa");//private java.lang.String reflect.User.aaa()
        System.out.println(dm);
        Constructor dc=Class.forName("reflect.User").getDeclaredConstructor(String.class);//private reflect.User(java.lang.String)
        System.out.println(dc);

        //通过反射创建对象,使用私有构造器创建
        Constructor dcc=Class.forName("reflect.User").getDeclaredConstructor(String.class);//返回构造器,包括私有
        dcc.setAccessible(true);//暴力破解
        Object a=dcc.newInstance("SSSSSSSSS");
        System.out.println(a);//User [name=SSSSSSSSS, age=null, app=null]

        //通过反射调用私有方法
        Method dms=Class.forName("reflect.User").getDeclaredMethod("aaa");
        dms.setAccessible(true);
        System.out.println(dms.invoke(a, null));//User [name=SSSSSSSSS, age=null, app=null]
        System.out.println(dms.invoke(Class.forName("reflect.User").newInstance(), null));//User [name=null, age=null, app=null]
        /*************************************************/
        //结合以上内容综合使用
        Method Amethon=Class.forName("reflect.User").getDeclaredMethod("User",String.class,Integer.class,App.class);
        Object value = Amethon.invoke(Class.forName("reflect.User").newInstance(), "aaa",12,Class.forName("reflect.App")
                .getDeclaredConstructor(Integer.class,Integer.class).newInstance(100,200));
        System.out.println(value);//User [name=aaa, age=12, app=App [weight=100, height=200]]
    }
}

运行后:

public class reflect.User
public class reflect.User
public class reflect.User
public
User [name=null, age=null, app=null]
true
true
接口:true
类:false
true
false
reflect.User
reflect.User
类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
class reflect.U
class reflect.U
包:package reflect
1
User
String
app,
toString,getName,setName,User,getApp,setAge,getAge,setApp,getType,setType,wait,wait,wait,equals,hashCode,getClass,notify,notifyAll,
reflect.User|2:class java.lang.String,class java.lang.Integer,reflect.User|0:reflect.User|3:class java.lang.String,class java.lang.Integer,class reflect.App,
public reflect.App reflect.User.app
public java.lang.String reflect.User.toString()
User [name=null, age=null, app=null]
User [name=1111, age=11, app=null]
reflect.User$P,
name,age,app,
toString,getName,setName,aaa,User,getApp,setAge,getAge,setApp,
app|2:class java.lang.String,class java.lang.Integer,app|1:class java.lang.String,app|0:app|3:class java.lang.String,class java.lang.Integer,class reflect.App,
private java.lang.String reflect.User.name
private java.lang.String reflect.User.aaa()
private reflect.User(java.lang.String)
User [name=SSSSSSSSS, age=null, app=null]
User [name=SSSSSSSSS, age=null, app=null]
User [name=null, age=null, app=null]
User [name=aaa, age=12, app=App [weight=100, height=200]]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值