反射

本文深入探讨了Java反射机制的应用,包括通过不同方式获取Class对象、使用反射创建实例、调用构造方法、获取并调用公开及私有方法,以及获取和修改私有属性等关键操作。
package com.bawei.com.reflection.fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Created by lenovo on 2018/1/24.
 */

public class reflection {


    public static void main(String[] args) {
        Person person = new Person();
        //第一种
        Class c1 = Person.class;
        Class c2 = person.getClass();
        Class c3 = null;
        try {
            c3 = Class.forName("com.bawei.com.reflection.fanshe.Person");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.print(c1 == c2);
        System.out.print(c1 == c3);
        try {
            //建立对象
            Person pp = (Person) c1.newInstance();
            pp.fun();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //获取无参构造函数
        try {
            //    Constructor constructor = c1.getConstructor(null);//私有
            Constructor declaredConstructor = c1.getDeclaredConstructor(null);//公有
            Person pp1 = (Person) declaredConstructor.newInstance(null);
            declaredConstructor.setAccessible(true);
            pp1.fun();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //获取有参构造
        try {
            //类型传惨
            Constructor constructor = c1.getConstructor(String.class, int.class);
            //数组的形式
       //   Constructor constructor1 = c1.getConstructor(new Class[]{String.class,Integer.class});
            Person pp1 = (Person) constructor.newInstance("kson", 100);
            pp1.fun();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //获取公共的方法
        try {
            //获取方法 一个参数是 方法名 第2个是参数类型
            Method method = c1.getMethod("fun", String.class);
            //有反射调
            method.invoke(c1.newInstance(), "张露");
        } catch (Exception e) {
            e.printStackTrace();
        }

        //获取私有的方法
        try {
            //获取方法 一个参数是 方法名 第2个是参数类型
            Method method = c1.getDeclaredMethod("fun1", int.class);
            //暴力
            method.setAccessible(true);
            //有反射调
            method.invoke(c1.newInstance(), 100);
        } catch (Exception e) {
            e.printStackTrace();
        }

         //获取属性修改属性
        try {
            //获取私有属性
           Person o= (Person) c1.newInstance();
            Field field = c1.getDeclaredField("name");
            field.setAccessible(true);
            field.set(o,"zhanglu");
            System.out.print(o.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



package com.bawei.com.reflection.fanshe;

/**
 * Created by lenovo on 2018/1/24.
 */

public class Person {

    private String name;
    private int age;



    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;

        System.out.print("name=====" + name+"===========age==================="+age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void fun() {
        System.out.print("fun");
    }

    public void fun(String name) {

        System.out.print("+name=====" + name);

    }

    private void fun1(int age) {

        System.out.print("+age=====" + age);

    }


}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值