精华内容
下载资源
问答
  • I'm working with the basics of Java reflection and observing information on methods of classes. I need to get a method that matches specifications as described by the getMethod() function. However, .....

    I'm working with the basics of Java reflection and observing information on methods of classes. I need to get a method that matches specifications as described by the getMethod() function. However, when I do this I get a NoSuchMethodException, and I was hoping you could tell me why my implementation is incorrect.

    static void methodInfo2(String className) throws ClassNotFoundException,

    NoSuchMethodException{

    Class cls = null;

    try{

    cls = Class.forName(className);

    } catch(ClassNotFoundException e){

    e.printStackTrace();

    }

    System.out.println("Cls: "+cls);

    Method method1 = cls.getMethod("test", null);

    System.out.println("method1: "+method1);

    }

    EDIT1:When I print out "Cls: "+cls, the output is "Cls: class a8.myclass2". Why does it append the class part? (the a8 is correct, so don't worry about that) /EDIT1

    This is the function I use to read in a class from my main function, and then I want to getMethod() with the parameters "test" and null, where "test" is the name of the method and null means the method has no parameters. The class I am reading in is called myclass2 which is here:

    package a8;

    public class myclass2 {

    void test(){

    //"takes no parameters"

    //"returns bool"

    //"name starts with test"

    //return true;

    }

    }

    As you can see, the method does infact exist in the class. If you could point out my mistake, I would really appreciate it.

    解决方案

    Make your test method public. I believe Class.getMethod() is limited to public methods.

    展开全文
  • Java反射getMethod() 与invoke的使用

    千次阅读 2018-01-31 11:10:15
    反射概述  Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作... Java反射机制主要提供了以下功能: 在运行时构造任意一个类的...

    http://blog.csdn.net/lycorisradiata_1/article/details/48493255

    反射概述

         Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。

      Java反射机制主要提供了以下功能:

    • 在运行时构造任意一个类的对象
    • 在运行时获取任意一个类所具有的成员变量和方法
    • 在运行时调用任意一个对象的方法(属性)
    • 生成动态代理

     

      Class 是一个类; 一个描述类的类.

      封装了描述方法的 Method,

                  描述字段的 Filed,

                  描述构造器的 Constructor 等属性.

     

    package com.java.my;
    
    import com.java.my.service.testService;
    
    /**
     * @author wanjiadong
     * @description
     * @date Create in 9:53 2018/1/31
     */
    public class test1 {
        public static void main(String[] args) throws Exception {
            //第一种newInstance实例一个对象,通常与forName()配合使用
            testService t = (testService) Class.forName("com.java.my.service.testService").newInstance();
            String str = t.checkName("ff");
    
            //使用反射
            Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("com.java.my.service.testService");
            Object cStr = c.getMethod("checkName",String.class).invoke(c.newInstance(),"ff");
            System.out.println(cStr.toString());
        }
    }
    

     

     

    public static void main(String[] args) throws Exception {
    //        Class clazz = Test1.class;
    //        Test1 test1 = (Test1) clazz.newInstance();
    //
    //        Field[] fields = clazz.getDeclaredFields();
    //        Constructor[] constructors = clazz.getDeclaredConstructors();
    //        System.out.println(clazz.getClassLoader());
    
            Class clazz = Thread.currentThread().getContextClassLoader().loadClass("com.pojo.Test1");
            clazz = Class.forName("com.pojo.Test1");
            Method method = clazz.getDeclaredMethod("saySomething",String.class, int.class);
            Object objecct = method.invoke(clazz.newInstance(), "nima", 4);
            System.out.println(objecct.toString());
    
            Method method1 = clazz.getDeclaredMethod("saySomething1",String.class, int.class);
            method1.setAccessible(true);
            Object objecct1 = method1.invoke(clazz.newInstance(), "nima111", 5);
            System.out.println(objecct1.toString());
    
            Field field = clazz.getDeclaredField("sex");
            field.setAccessible(true);
            System.out.println(field.get(clazz.newInstance()));
    
        }

     

     

    展开全文
  • Java反射(包含getMethod以及invoke)

    千次阅读 2017-08-29 11:19:28
    Java反射(包含getMethod以及invoke)**Java反射:***定义:* 百度百科:反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而...

    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 反射使用 Class.getMethod 应注意

    千次阅读 2018-07-12 23:19:28
    java 反射使用 Class.getMethod 应注意 记录下 Method method= clazz.getMethod(setMethodName,propertiesClass); 如果使用方法 会不能获取以多态方式传入的参数 会抛异常 java.lang.NoSuchMethodException比如: ...

    java 反射使用 Class.getMethod 应注意 记录下

    Method method= clazz.getMethod(setMethodName,propertiesClass);
    如果使用该方法 会不能获取以多态方式传入的参数
    会抛异常 java.lang.NoSuchMethodException
    比如:

    public class Student {

    private String name;
    
    private int age;
    
    private List list = new ArrayList();
    
    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;
    }
    
    public List<Object> getList() {
        return list;
    }
    
    public void setList(List<Object> list) {
        this.list = list;
    }

    }

     public static void main(String[] args) {
        try {
            Class<?> clazz= Class.forName(Student.class.getTypeName());
            List list = new ArrayList();
            clazz.getMethod("setList",list.getClass());
    
        } catch (ClassNotFoundException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    
    }
    
        此时会抛异常:
        java.lang.NoSuchMethodException: com.jcb.xml.model.Student.setList(java.util.ArrayList)
    
        解决方案:
    
        /**
     * 获取只有一个参数的对应方法
     * @param className
     * @param methodName
     * @return
     */
    private Method getMethod(String className,String methodName,Class<?> propertiesClass){
    
        Method[] methods=getMethods(className);
        for (Method method : methods) {
            if(method.getName().equals(methodName)){
                if(method.getParameterCount() == 1){
                    //该函数的参数类型和传入参数类型相同
                    if(method.getParameterTypes()[0].getTypeName().equals(propertiesClass.getTypeName())){
                        return method;
                        //该函数的参数类型是传入参数类型的父类
                    }else if(method.getParameterTypes()[0].getTypeName().equals(propertiesClass.getSuperclass().getTypeName())){
                        return method;
                    }else
                    {
                        Set<String> superClassAndSuperInterfaceList= this.getAllSuperClassAndSuperInterface(propertiesClass);
                        //如果传入参数类型是参数类型的子类 也返回改函数
                        if(superClassAndSuperInterfaceList.contains(method.getParameterTypes()[0].getTypeName()))
                            return method;
    
                    }
                }
            }
        }
        return  null;
    }
    
        /**
     * 获取所有父类类型和父类接口类型
     * @param clazz
     * @return
     */
    private Set<String> getAllSuperClassAndSuperInterface(Class<?> clazz){
        Set<String> superClassAndSuperInterfaceList = new HashSet<>();
        getAllSupersClasss(superClassAndSuperInterfaceList,clazz);
        getAllSuperInterfaces(superClassAndSuperInterfaceList,clazz);
        return superClassAndSuperInterfaceList;
    }
    
    /**
     * 递归获取所父类 类型
     * @param parentClassList
     * @param clazz
     */
    private Set<String> getAllSupersClasss(Set<String> parentClassList,Class<?> clazz){
        parentClassList.add(clazz.getSuperclass().getName());
        if(Object.class.getTypeName()!=clazz.getSuperclass().getTypeName()){
            //父类也可能实现接口
            getAllSuperInterfaces(parentClassList,clazz.getSuperclass());
            //递归查询父类
            getAllSupersClasss(parentClassList,clazz.getSuperclass());
        }
        return parentClassList;
    }
    
    /**
     * 递归获取父类接口
     * @param parentInterfaceList
     * @param clazz
     */
    private Set<String> getAllSuperInterfaces(Set<String> parentInterfaceList,Class<?> clazz){
        for (Class<?> aClass : clazz.getInterfaces()) {
            parentInterfaceList.add(aClass.getTypeName());
            //递归查询实现接口
            getAllSuperInterfaces(parentInterfaceList,aClass);
        }
        return parentInterfaceList;
    }
    
        使用该getMethod 代替反射 Class.getMethod 方法 就可以  
    
        多参数函数类似

    第二种方法 更清晰 包含多参数函数
    /**

    • 获取参数所对应的函数
    • @param className
    • @param argsClass
    • @return
      */
      private Method getMethod(String className, String methodName,Class<?>[] argsClass){
      Method[] methods=getMethods(className);
      for (Method method : methods) {
      if(method.getName().equals(methodName)) {
      if (method.getParameterTypes().length == argsClass.length) {
      if (checkArgsType(method.getParameterTypes(), argsClass)) {
      return method;
      }
      } else {
      continue;
      }
      }
      }

      return null;

      }

      /**

    • @param sourceArgsClass 函数的参数类型
    • @param argsClass 传入函数的参数类型
    • @return
      */
      private boolean checkArgsType(Class<?>[] sourceArgsClass,Class<?>[] argsClass){

      for (int i =0;i< sourceArgsClass.length;i++) {
          //aClass.isAssignableFrom(bClass)  判断a是否是b的父类或则父接口
          if(!sourceArgsClass[i].isAssignableFrom(argsClass[i]))
              return false;
      
      }
      
      return true;

      }

    转载于:https://blog.51cto.com/5013162/2141201

    展开全文
  • 反射getMethod获取set方法

    千次阅读 2019-07-19 19:16:46
    Method m2 = obj.getClass().getMethod("setName",String.class) 第二个参数写为set属性的类型,否则报 noSuchMethodException的异常
  • 思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式? Java中创建对象大概有这几种方式: 1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式 2、使用Clone的方法:无论何时...
  • import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class AsClass { public X x; @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(Stri
  • java使用反射执行方法java反射执行,package cn.opackage cn.outofmemory.snippets.core;import java.lang.reflect.Method;public class InvokeMethodWithReflection { public static void main(String[] args) ...
  • getMothod()方法:调用公共方法,不能反射调用私有方法,有时使用不当会有NoSuchMethodException异常,具体来说就是:获取当前类和父类的所有public的方法。这里的父类,指的是继承层次中的所有父类。比如说,A继承B...
  • 如何使用 Java 反射反射用法及案例

    千次阅读 热门讨论 2019-01-30 15:54:40
    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主威威喵原创,请多... Java Reflection,称为 Java 反射,是Java基础部分的一个比较难的点。Reflection(反射)是被视为动态语言的关键,...
  • 今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类方法时,发生NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,...
  • Java反射用法

    2020-11-01 21:23:47
    Java反射用法 获取反射入口(反射操作都要先拿到入口): 常见的反射入口获取方法有三种,分别为: Class.forName(全类名(路径)); 类.class ; 对象.getClass(); 二:常用方法: 1:拿方法: 反射中拿方法...
  • I need to invoke the setter methods of a class using reflection, and the code is as below:try {Method method = myObj.getClass().getMethod("set" + fieldName, new Class[] { value.getClass() });...
  • 1、介绍Java反射机制和Java注解 2、利用Java反射调用类方法 3、实例讲解:自定义Java注解
  • ff313976的专栏 ...赠书 | 异步2周年,技术图书免费选 每周荐书:分布式、深度学习算法、iOS(评论送书) 项目管理+代码托管+文档...java反射机制详解 及 Method.invoke解释 getMethod 标签: javacl
  • 功能: 通过读取另一个Dll去创建一...创建控件的大致流程是,Assembly->Module,然后遍历Module的Type,然后创建,下面是反射 Field.getValue setValue Method.invoke 其实都是赋值的意思.. 1.反射属性:  
  • Java反射

    万次阅读 多人点赞 2019-08-28 22:58:42
    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。 用途 ...
  • 一、定义java反射:程序运行时,通过反射获取类的所有属性和方法, 动态创建对象,调用对象的属性和方法。二、Method是位于java.lang.reflect包下在java反射中共有四种方法:1、getMethods();获得类的public类型方法...
  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 ...
  • java反射用法

    2020-01-21 18:01:24
    使用步骤: 第一步,拿到类入口 ...Method method = docClass.getMethod("方法名",new Class[]{}) 第三步,取值 比如获取该方法的注解的属性,只需要method.getAnnotation annotation.annotationTyp...
  • 使用Java反射检查静态方法 本文讨论如何通过Java反射检查静态方法。 1. 为了演示,我们定义包含几个静态方法的StaticUtility类: public class StaticUtility { public static String getAuthorName() { return ...
  • java反射使用

    千次阅读 2018-11-14 18:49:27
    java反射使用 Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性 灵活使用反射能让我们代码更加灵活,这里比如JDBC原生代码注册驱动,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,947
精华内容 17,978
关键字:

java反射getmethod用法

java 订阅