Java之反射代码演示说明

还不存在的类–即我们需要使用反射来使用的类

Person类:

package com.qf.demo4;

public class Person {

    private String name;
    public int age;
    static int weight;
    int male;
    protected int num;

    public Person(String name, int age, int weight) {
        this.name = name;
        this.age = age;
        this.weight = weight;
        System.out.println("有参数的构造方法");
    }

    public Person() {
        System.out.println("无参数的构造方法");
    }

    public void eat() {
        System.out.println("吃");
    }

    public void drink(String type) {
        System.out.println("喝" + type);
    }

    public String sleep() {
        System.out.println("睡");
        return "呵呵";
    }

    private void play() {
        System.out.println("玩");
    }

    public static void hehe() {
        System.out.println("heheheheh");
    }

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

演示代码:


Test1:创建Class对象

package com.qf.demo4;

import com.qf.demo.Person;
/**
 * 每一个类只有一个class 对象
 * com.qf.demo.Person 包名+类名  全限定名
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        // 创建Class 对象
        // 第一种方式:类.class
        Class class1 = Person.class;
        System.out.println(class1.hashCode());
        // 第二种方式:创建类的对象;然后--对象.getClass()
        Person person = new Person();
        Class class2 = person.getClass();
        System.out.println(class2.hashCode());


        // 第三种方式:使用forname方法,参数为相对于本工程的地址
        try {
            Class class3 = Class.forName("com.qf.demo.Person");
            System.out.println(class3.hashCode());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Test2:创建Constructor对象,并创建Person类(还没有的类)对象

package com.qf.demo4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test2 {

    public static void main(String[] args) {

        try {
            Class class1 = Class.forName("com.qf.demo4.Person");
            Constructor[] constructors = class1.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor);
            }


            // 1 通过构造方法创建  Perosn对象
            Constructor constructor = class1.getConstructor(null);// 得到无参的构造方法
            Person person = (Person) constructor.newInstance(null);
            System.out.println(person);


            // 2 利用有参数的构造方法创建对象
            Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
            Person person2 = (Person) constructor2.newInstance("张三",5,9);
            System.out.println(person2);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Test3:获取方法,以及调用方法

package com.qf.demo4;

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

public class Test3 {

    public static void main(String[] args) {
        try {
            Class class1 = Class.forName("com.qf.demo4.Person");
            // 得到构造方法
            Constructor constructor = class1.getConstructor(null);
            Object object = constructor.newInstance(null);

            Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法

            Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有)

            // 得到 无参  无返回值的 方法并且调用
            Method method = class1.getMethod("eat", null);
            //            调用方法的对象    实际参数
            method.invoke(object, null);// 是哪个方法被调用

            // 调用  有参数 无返回值的方法
            Method method2 = class1.getMethod("drink", String.class);
            method2.invoke(object, "水");

            // 有返回值的
            Method method3 = class1.getMethod("sleep", null);
            Object  object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值
            System.out.println(object2);

            // 得到静态的方法
            Method method4 = class1.getMethod("hehe", null);
            method4.invoke(null, null);// 静态方法不需要传递对象  直接写null


            // 私有的   私有的方法 必须用 getDeclaredMethod 才能得到
            Method method5 = class1.getDeclaredMethod("play", null);
            method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
            method5.invoke(object, null);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

反射定义:http://blog.csdn.net/baidu_37107022/article/details/71234940

posted @ 2017-05-05 19:39  TCB_Java  阅读(255)  评论(0编辑  收藏  举报