Java反射(包含getMethod以及invoke)

Java反射(包含getMethod以及invoke)

Java反射:

定义:

    百度百科:反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。

    我的理解:Java反射就是我们可以通过反射机制来获得访问Java对象的构造方法、方法以及属性等。

关于反射三种实现方法:
package com.mzsds.fanshe;

        public class fanshe {

            public static void main(String... args) {
                try {
                    // 第一种方法,forName()静态方法:Class.forName(String str);
                    // 注意:className - 所需类的完全限定名。
                    Class class1 = Class.forName("com.mzsds.fanshe.fanshe");
                    System.out.println("第一种方法:" + class1);

                    // 第二种方法,.class
                    Class class2 = String.class;
                    System.out.println("第二种方法:" + class2);

                    // 第三种方法,.getClass();
                    fanshe fs = new fanshe();
                    Class class3 = fs.getClass();
                    System.out.println("第三种方法:" + class3);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            public void test() {
                System.out.println("----test类----");
            }
        }
输出测试结果:

    第一种方法:class com.mzsds.fanshe.fanshe
    第二种方法:class java.lang.String
    第三种方法:class com.mzsds.fanshe.fanshe

创建通过反射得到类的对象实例:
package com.mzsds.fanshe;

        public class fanshe {

            public static void main(String... args) throws InstantiationException, IllegalAccessException {
                try {
                    //使用newInstance()创建一个对象
                    Class class1 = Class.forName("com.mzsds.fanshe.fanshe");
                    fanshe f = (fanshe)class1.newInstance();
                    f.test();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }

            public void test() {
                System.out.println("----test类----");
            }
        }
输出测试结果:

    ----test类----

.getName()方法(getName()方法输出少了class和一个空格):
    package com.mzsds.fanshe;

        public class fanshe {

            public static void main(String... args) throws InstantiationException, IllegalAccessException {
                try {
                    Class class1 = Class.forName("com.mzsds.fanshe.fanshe");
                    System.out.println(class1);
                    System.out.println(class1.getName());
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
输出测试结果:

    class com.mzsds.fanshe.fanshe
    com.mzsds.fanshe.fanshe

常用方法:

    getDeclaredMethods() 获取所有的方法(包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法)
    getReturnType() 获得方法的返回类型
    getParameterTypes() 获得方法的传入参数类型
    getDeclaredMethod(String name, Class... parameterTypes) 获得特定的方法  

关于getMethod()以及 invoke()的应用:

    getMethod(String name, Class... parameterTypes) 

        返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。

    invoke(Object obj, Object... args) 

        对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
package com.mzsds.fanshe;

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

        public class fanshe {
            public static void main(String[] args) {
                String[] names = { "mzm", "hmy", "wlk", "xpo" };
                Class clazz = Test.class;
                try {
                    Method method = clazz.getMethod("cs", String.class);
                    for (String name : names)
                        method.invoke(clazz.newInstance(), name);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                }
            }
        }

        class Test {
            public void cs(String name) {
                System.out.println("----" + name + "----");
            }
        }
    输出测试结果:

    ----mzm----
    ----hmy----
    ----wlk----
    ----xpo----

你可能感兴趣的:(Java小知识)