Java反射一

**

java编程之反射(一)

**
反射是框架设计的灵魂;框架是半成品的软件,
反射是将类的各个组件部分封装为其他的对象,这就是反射机制
好处:
1.可以在程运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性。

代码实现
1.利用反射实现获取和修改成员变量

package reflect;

import java.lang.reflect.Field;

public class ReflectDome {//获取成员变量们
    public static void main(String[] args) throws Exception{
        //0.获取Person的Class对象
        Class personClass = Person.class;
        //1.Filed[] getFields() 获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("------------");
        Field a = personClass.getField("a");//getField("a")获取一个修饰符为public的名字为“a”的成员变量
        //获取成员变量a的值
        Person p=new Person();
        Object o = a.get(p);
        System.out.println(o);
        //设置a的值
        a.set(p,"张三");
        System.out.println(p);
        System.out.println("-------------");

        //Field[] getDeclaredFieds():获取所有的成员变量,不考虑修饰符;
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        //Field getDeclaredFieds(String name):
        Field d = personClass.getDeclaredField("d");
        //忽略访问修饰符的安全检查,不忽略访问私有的成员变量时会报错,可以称之为暴力反射
        d.setAccessible(true);
        Object value = d.get(p);
        System.out.println(value);

    }
}

执行结果:

"D:\Program Files\Java\jdk1.8.0_131\bin\java" "-javaagent:D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\idea_rt.jar=50092:D:\JetBrains\IntelliJ IDEA 2017.2.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;G:\文档\Java\production\day4_基础加强;D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\junit-4.12.jar;D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\hamcrest-core-1.3.jar" reflect.ReflectDome
public java.lang.String reflect.Person.a
------------
null
Person{name='null', age=0, a='张三', b='null', c='null', d='null'}
-------------
private java.lang.String reflect.Person.name
private int reflect.Person.age
public java.lang.String reflect.Person.a
protected java.lang.String reflect.Person.b
java.lang.String reflect.Person.c
private java.lang.String reflect.Person.d
null

Process finished with exit code 0

2.利用反射实现获取构造方法们

package reflect;

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

public class ReflectDome1 {//获取构造方法们
    public static void main(String[] args) throws Exception{

        /**
         * Constructor<?>[] getConstructors()
         * Constructor<T>[] getConstructors(类<?>...parameterTypes)
         *
         * Constructor<T>[] getDeclaredConstructors(类<?>...parameterTypes)
         * Constructor<?>[] getDeclaredConstructors()
         */
        Class personClass = Person.class;//0.获取Person的Class对象
        //Constructor<T>[] getConstructors(类<?>...parameterTypes)
        Constructor constructor = personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);
        //创建对象有参数 newInstance(String,int);
        Object person = constructor.newInstance("张宇航", 21);
        System.out.println(person);
        System.out.println("-------");
        //创建无参的构造方法
        Object person1 = personClass.newInstance();
        System.out.println(person1);
        //如果创建空参的构造方法,可以采用简化的方法
        Object o = personClass.newInstance();
        System.out.println(o);


    }
}

执行结果:

"D:\Program Files\Java\jdk1.8.0_131\bin\java" "-javaagent:D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\idea_rt.jar=50186:D:\JetBrains\IntelliJ IDEA 2017.2.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;G:\文档\Java\production\day4_基础加强;D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\junit-4.12.jar;D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\hamcrest-core-1.3.jar" reflect.ReflectDome1
public reflect.Person(java.lang.String,int)
Person{name='张宇航', age=21, a='null', b='null', c='null', d='null'}
-------
Person{name='null', age=0, a='null', b='null', c='null', d='null'}
Person{name='null', age=0, a='null', b='null', c='null', d='null'}

Process finished with exit code 0

3.利用反射实现获取成员方法们和调用他们

package reflect;

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

public class ReflectDome2 {//获取成员方法们
    public static void main(String[] args) throws Exception{

        /**
         *Method[] getMethods()
         * Method[] getMethods(String name,类<?>...paramerTypes)  获取修饰符为public的
         *
         * Method[] getDeclaredMethods()
         * Method[] getDeclaredMethods(String name,类<?>...paramerTypes) 能够获取所有级别修饰符,需要使用.setAccessible(true);暴力反射,否则报错
         */
        Class personClass = Person.class;//0.获取Person的Class对象
        //获取指定名称的无参成员方法
        Method eat = personClass.getMethod("eat");
        Person p=new Person();
        //执行方法
        eat.invoke(p);//创建一个Person的对象然后执行eat方法

        //获取指定名称的有参成员方法
        Method eat1 = personClass.getMethod("eat",String.class);
        eat1.invoke(p,"饭");
        System.out.println("----------");
        //获取所有的public方法,包括object的方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
            //获取方法名
            String name=method.getName();
            System.out.println(name);
        }
        //获取类名
        String name = personClass.getName();
        System.out.println(name);


    }
}

执行结果:

"D:\Program Files\Java\jdk1.8.0_131\bin\java" "-javaagent:D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\idea_rt.jar=50260:D:\JetBrains\IntelliJ IDEA 2017.2.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;G:\文档\Java\production\day4_基础加强;D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\junit-4.12.jar;D:\JetBrains\IntelliJ IDEA 2017.2.6\lib\hamcrest-core-1.3.jar" reflect.ReflectDome2
eat....
eat...饭
----------
public java.lang.String reflect.Person.toString()
toString
public java.lang.String reflect.Person.getName()
getName
public void reflect.Person.setName(java.lang.String)
setName
public int reflect.Person.getAge()
getAge
public void reflect.Person.setAge(int)
setAge
public void reflect.Person.eat(java.lang.String)
eat
public void reflect.Person.eat()
eat
public final void java.lang.Object.wait() throws java.lang.InterruptedException
wait
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
wait
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
wait
public boolean java.lang.Object.equals(java.lang.Object)
equals
public native int java.lang.Object.hashCode()
hashCode
public final native java.lang.Class java.lang.Object.getClass()
getClass
public final native void java.lang.Object.notify()
notify
public final native void java.lang.Object.notifyAll()
notifyAll
reflect.Person

Process finished with exit code 0
package reflect;

public class Person {
    private String name;
    private int age;
    public String a;
    protected String b;
    String c;
    private String d;

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

    public Person() {

    }

    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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }
    public void eat(){
        System.out.println("eat....");
    }
    public void eat(String food){
        System.out.println("eat..."+food);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值