java基础

2019/07/16 Java

日常当中遇到的java知识点积累

目录

java反射

1.getMethod()不能调用私有方法

public class ReflectTest {

    static class User
    {
        private String name;
        private int agge;
        private String getName()
        {
            return name;
        }
        private void setName(String name)
        {
            this.name = name;
        }
        private int getAge()
        {
            return agge;
        }
    }

    public static void main(String[] args) throws Exception
    {
        User user = new User();
        user.setName("小菜");

        //只能调用公共方法
        Method[] methods = User.class.getMethods();
        for (Method method : methods)
        {
            if ("getName".equals(method.getName()))
            {
                System.out.println(method.invoke(user));
            }
            else if ("setName".equals(method.getName()))
            {
                //调用setName方法设置名字为"大鸟"
                method.invoke(user, "大鸟");
                System.out.println(user.getName());
            }
        }
    }
}

上面代码,User类全是私有方法,那么User.class.getMethods()时不会报错,但是获取不到方法,所以遍历没有输出

public class ReflectTest {

    static class User
    {
        private String name;
        private int age;
        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name;
        }
        public int getAge()
        {
            return age;
        }
    }

    public static void main(String[] args) throws Exception
    {
        User user = new User();
        user.setName("小菜");

        //只能调用公共方法
        Method[] methods = User.class.getMethods();
        for (Method method : methods)
        {
            if ("getName".equals(method.getName()))
            {
                //调用getName()方法,无参不用传
                System.out.println(method.invoke(user));
            }
            else if ("setName".equals(method.getName()))
            {
                //调用setName方法设置名字为"大鸟",并且必须传入参数,否则报错
                method.invoke(user, "大鸟");
                System.out.println(user.getName());
            }
        }

    }
}

将私有改为公共方法,可以获取到,如果方法method带有参数,那么metho.invoke()第一个参数为对象,然后method有几个参数,就在对象后面传多少个参数,不然报错。 java里的反射并不是只能获取值,还可以动态的给某个方法赋值。 输出:小菜 大鸟

2. public Method getDeclaredMethod(String name, Class<?>… parameterTypes)

public class ClassDemo {

    public static void main(String[] args) {

        ClassDemo cls = new ClassDemo();
        Class c = cls.getClass();

        try {
            // parameter type is null
            Method m = c.getDeclaredMethod("show", null);
            System.out.println("method = " + m.toString());

            // method Integer
            Method lMethod = c.getDeclaredMethod("showInteger", Integer.class);
            System.out.println("method = " + lMethod.toString());
        } catch(NoSuchMethodException e) {
            System.out.println(e.toString());
        }
    }

    private Integer show() {
        return 1;
    }

    public void showInteger(Integer i) {
        this.i = i;
    }
    public int i = 78655;
}

输出: method = private java.lang.Integer com.lzb.javabase.ClassDemo.show()

method = public void com.lzb.javabase.ClassDemo.showInteger(java.lang.Integer)

例子来源于:https://www.tutorialspoint.com/java/lang/class_getdeclaredmethod.htm

getdeclaredmethod()方法返回一个方法对象,该方法对象反映该类对象表示的类或接口的指定声明方法。name参数是一个字符串,它指定所需方法的简单名称, parameterTypes参数是一个类对象数组,它按照声明的顺序标识方法的形式参数类型。说白就是根据方法名和方法参数返回一个方法对象。

3.getParameterTypes()

/**
 * java反射调用set方法赋值
 * @author lizhibiao
 * @date 2019/7/16 15:54
 */
public class ClassDemo {

    static class User
    {
        private String name;
        private int age;
        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name;
        }
        public void test(User user)
        {

        }

    }

    public static void main(String[] args) throws Exception
    {
        User user = new User();
        user.setName("小菜");

        //只能调用公共方法
        Method[] methods = User.class.getMethods();
        for (Method method : methods)
        {
            if ("test".equals(method.getName()))
            {
                //method.getParameterTypes()[0]获取的是User类下test()方法第一个参数,该参数就是一个User对象
                System.out.println(method.getParameterTypes()[0].toString());

                //根据拿到的User对象,我们可以再去调用User对象下的getName方法,然后传入当前user对象进行反射调用
                System.out.println(method.getParameterTypes()[0].getMethod("getName").invoke(user));
            }
        }
    }
}

method.getParameterTypes()[0]获取的是该方法第一个参数对象,然后我们可以很方便再去获取该参数对象下的所有方法

Search

    Table of Contents