码迷,mamicode.com
首页 > 编程语言 > 详细

Java反射基础

时间:2015-05-07 06:23:19      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

import java.io.InputStream;
import java.util.List;

public class Person {

    public Integer id = 1;

    private String name = "default";

    private static String password = "pass";

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

    public Person(Integer id, String name) {
        this.id = id;
        this.name = name;
        System.out.println("有参构造函数");
    }

    private Person(List list) {
        System.out.println("私有有参构造函数");
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String run() {
        System.out.println("run...");
        return "run";
    }

    public String eat() {
        System.out.println("eat...");
        return "eat";
    }

    /*测试反射的方法*/
    public void m1() {
        System.out.println("m1");
    }

    public void m1(String name, int age) {
        System.out.println(name + " - " + age);
    }

    public Class[] m1(String name, int[] age) {
        return new Class[]{String.class};
    }

    private void m1(InputStream inputStream) {
        System.out.println(inputStream);
    }

    public static void m1(int num) {
        System.out.println(num);
    }

    public static void main(String[] args) {
        System.out.println("main method");
    }
}
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ReflectDemo {

    public static void main(String[] args) throws InvocationTargetException {

        try {
            Class clazz = Class.forName("Person");

            // 反射构造器
            Constructor constructor = clazz.getConstructor(null);
            Person person = (Person) constructor.newInstance(null);

            Constructor constructor1 = clazz.getConstructor(Integer.class, String.class);
            Person person1 = (Person) constructor1.newInstance(1, "jack");

            Constructor constructor2 = clazz.getDeclaredConstructor(List.class);// private method
            constructor2.setAccessible(true);
            Person person2 = (Person) constructor2.newInstance(new ArrayList<>());

            Person person3 = (Person) clazz.newInstance();

            // 反射类的方法
            Person p = new Person();

            Method method = clazz.getMethod("m1", null);
            method.invoke(p, null);

            Method method1 = clazz.getMethod("m1", String.class, int.class);
            method1.invoke(p, "jack", 11);

            Method method2 = clazz.getMethod("m1", String.class, int[].class);
            Class[] classes = (Class[]) method2.invoke(p, "rose", new int[]{1, 2, 3});
            System.out.println(classes[0]);

            Method method3 = clazz.getDeclaredMethod("m1", InputStream.class);
            method3.setAccessible(true);
            /*method3.invoke(p, null);*/

            Method method4 = clazz.getMethod("m1", int.class);
            method4.invoke(null, 23); //静态方法调用不需要对象

            // 反射 main 方法
            Method main = clazz.getMethod("main", String[].class);
            //main.invoke(null, new Object[]{new String[]{"a", "b"}});
            main.invoke(null, (Object) new String[]{"a", "b"});


            // 反射类的字段
            Field field = clazz.getField("id");
            Class type = field.getType();
            if (type.equals(Integer.class)) {
                field.set(p, 11);// setter
                Integer id = (Integer) field.get(p);
                System.out.println(id);
            }

            Field field1 = clazz.getDeclaredField("name");
            field1.setAccessible(true);
            String name = (String) field1.get(p);
            System.out.println(name);

            Field field2 = clazz.getDeclaredField("password");
            field2.setAccessible(true);
            String password = (String) field2.get(p);
            System.out.println(password);

        } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | NoSuchFieldException e) {
            e.printStackTrace();
        }

    }
}

 

可以用到的工具类:BeanUtils,http://commons.apache.org/proper/commons-beanutils/

Java反射基础

标签:

原文地址:http://www.cnblogs.com/geb515/p/4483699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!