java object 转int_JAVA反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

获取Class对象的三种方式参照代码,下面介绍Class常用方法,具体的请参考API。

Person类:

public class Person {

    //构造方法
    public Person() {
        System.out.println("无参构造函数");
    }
    public Person(String name){
        System.out.println("姓名:"+name);
    }
    public Person(String name,int age){
        System.out.println("姓名:"+name+","+"年龄:"+age);
    }
    private Person(int age){
        System.out.println("年龄(私有构造函数):"+age);
    }


    //方法
    public void show1(String s){
        System.out.println("调用了:公有的,String参数的show1(): s = " + s);
    }
    protected void show2(){
        System.out.println("调用了:受保护的,无参的show2()");
    }
    void show3(){
        System.out.println("调用了:默认的,无参的show3()");
    }
    private String show4(int age) {
        System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
        return "abcd";
    }

    //成员变量
    public String name;
    protected int age;
    char sex;
    private String phoneNum;

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex
                + ", phoneNum=" + phoneNum + "]";
    }

}

反射构造函数:

import java.lang.reflect.Constructor;

/*
 *@name Test 
 *@description 反射Test
 *@time 2020/9/17 wuyx
*/
public class Test {

    public static void test1() throws Exception {
        /**
         * 获取CLASS对象的三种方式,全部异常本文抛出Exception
         */
//        1.通过Class类的静态方法:forName(String  className)
        Class clazz1 = Class.forName("com.fanshe.Person");
//        2.对象.getClass();
        Person person = new Person();
        Class clazz2 = person.getClass();
//        3.类名.class;
        Class clazz3 = Person.class;

        //反射无参构造函数
        Constructor constructor1 = clazz1.getConstructor(null);
        constructor1.newInstance(null);
        //反射一参构造函数
        Constructor constructor2 = clazz2.getConstructor(String.class);
        constructor2.newInstance("张三");
        //反射二参构造函数
        Constructor constructor3 = clazz2.getConstructor(String.class,int.class);
        constructor3.newInstance("张三",21);
        //反射私有构造函数
        Constructor constructor4 = clazz1.getDeclaredConstructor(int.class);
        constructor4.setAccessible(true);//暴力访问(忽略掉访问修饰符)
        constructor4.newInstance(27);

        System.out.println("--------------------");
        //反射得到所有构造函数
        Constructor[] constructors = clazz1.getDeclaredConstructors();
        for(Constructor c : constructors){
            System.out.println(c);
        }

    }

    public static void main(String[] args) throws Exception {
        test1();//构造函数
    }

}

输出结果:

无参构造函数 //这个为方法二实例化对象时输出
无参构造函数
姓名:张三
姓名:张三,年龄:21
年龄(私有构造函数):27
--------------------
private com.fanshe.Person(int)
public com.fanshe.Person(java.lang.String,int)
public com.fanshe.Person(java.lang.String)
public com.fanshe.Person()

反射方法:

    /*
     *@name  test2
     *@description 反射类中的方法
     *@params
     *@return
     *@time 2020/9/17 wuyx
    */
    public static void test2() throws Exception {
        Class clazz = Person.class;
        System.out.println("------------获取所有共有方法--------------");
        Method[] methods = clazz.getMethods();
        for(Method m : methods){
            System.out.println(m);
        }
        System.out.println("------------获取本类所有方法--------------");
        methods = clazz.getDeclaredMethods();
        for(Method m : methods){
            System.out.println(m);
        }
        System.out.println("------------获取show1方法--------------");
        Method method = clazz.getMethod("show1", String.class);
        System.out.println(method);
        //实例化一个Person对象
        Object object = clazz.getConstructor().newInstance();
        method.invoke(object,"show1方法");
        System.out.println("------------获取show4方法--------------");
        method = clazz.getDeclaredMethod("show4", int.class);
        System.out.println(method);
        method.setAccessible(true);//解除私有限定
        Object result = method.invoke(object,20);
        System.out.println("返回值:"+ result);

    }

输出结果:

------------获取所有共有方法--------------
public void com.fanshe.Person.show1(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
------------获取本类所有方法--------------
protected void com.fanshe.Person.show2()
void com.fanshe.Person.show3()
public void com.fanshe.Person.show1(java.lang.String)
private java.lang.String com.fanshe.Person.show4(int)
------------获取show1方法--------------
public void com.fanshe.Person.show1(java.lang.String)
无参构造函数  //实例化对象时输出
调用了:公有的,String参数的show1(): s = show1方法
------------获取show4方法--------------
private java.lang.String com.fanshe.Person.show4(int)
调用了,私有的,并且有返回值的,int参数的show4(): age = 20
返回值:abcd

反射成员变量:

    /*
     *@name  test3
     *@description 成员变量
     *@params
     *@return
     *@time 2020/9/17 wuyx
    */
    public static void test3() throws Exception {
        Class clazz = Person.class;
        System.out.println("------------获取所有公有的字段--------------");
        Field[] fields = clazz.getFields();
        for(Field field : fields){
            System.out.println(field);
        }
        System.out.println("------------获取所有的字段(包括私有、受保护、默认的)--------------");
        fields = clazz.getDeclaredFields();
        for(Field field : fields){
            System.out.println(field);
        }

        System.out.println("------------获取name字段并调用--------------");
        Field field = clazz.getField("name");
        System.out.println(field);
        //获取一个对象
        Object obj = clazz.getConstructor().newInstance();//产生Person对象
        //为字段设置值
        field.set(obj, "刘德华");//为Person对象中的name属性赋值
        //验证
        Person person = (Person)obj;
        System.out.println("验证姓名:" + person.name);

        System.out.println("------------获取phoneNum字段并调用--------------");
        field = clazz.getDeclaredField("phoneNum");
        System.out.println(field);
        field.setAccessible(true);//暴力反射,解除私有限定
        field.set(obj, "18888889999");
        System.out.println("验证电话:" + person);
        
    }

运行结果:

------------获取所有公有的字段--------------
public java.lang.String com.fanshe.Person.name
------------获取所有的字段(包括私有、受保护、默认的)--------------
public java.lang.String com.fanshe.Person.name
protected int com.fanshe.Person.age
char com.fanshe.Person.sex
private java.lang.String com.fanshe.Person.phoneNum
------------获取name字段并调用--------------
public java.lang.String com.fanshe.Person.name
无参构造函数
验证姓名:刘德华
------------获取phoneNum字段并调用--------------
private java.lang.String com.fanshe.Person.phoneNum
验证电话:Person [name=刘德华, age=0, sex= , phoneNum=18888889999]

这些是最基本的反射内容,当然还有其他的更多更深的用法,有时间接着更。

参考链接:

https://blog.csdn.net/sinat_38259539/article/details/71799078

用最直接的大白话来聊一聊Java中的反射机制_ju_362204801的博客-CSDN博客


联系我:

vx:w420749258

90d65080c1c751f09fd7b77a4a1fe0b7.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值