精华内容
下载资源
问答
  • 有时候我们希望像Javascript一样通过字符串调用方法,这就需要用到java的反射机制了。 下面给出一个示例: 1、先写一个测试的被调用方法(在 com.test 包下的 MyTest 方法,故全类名就是 com.test.MyTest) ...

    有时候我们希望像Javascript一样通过字符串调用方法,这就需要用到java的反射机制了。

    下面给出一个示例:

    1、先写一个测试的被调用方法(在 com.test 包下的 MyTest 方法,故全类名就是 com.test.MyTest)

    package com.test;
    public class MyTest {
    	public String hello(String param){
    		return "Hello "+param;
    	}
    }


    2、再写一个通过字符串调用其他方法的工具类

    public class CallMethod {
    
        /**
         * 通过字符串串调用方法
         * @param classAndMethod 类名-方法名,通过此字符串调用类中的方法
         * @param paramTypes 方法类型列表(因为方法可能重载)
         * @param params 需要调用的方法的参数列表
         * @return
         */
        public static Object call(String classAndMethod,Class[] paramTypes,Object[] params){
            String[] args=classAndMethod.split("-");
            //要调用的类名
            String className=args[0];
            //要调用的方法名
            String method=args[1];
            try {
                //加载类,参数是完整类名
                Class clazz = Class.forName(className);
    
                //第一个参数是方法名,后面的参数指示方法的参数类型和个数
                Method method=clazz.getMethod(method,paramTypes);
    
                //accessiable设为true表示忽略java语言访问检查(可访问private方法)
                //method.setAccessible(true);
    
                //第一个参数类实例(必须有对象才能调用非静态方法,如果是静态方法此参数可为null)
                //第二个是要传给方法的参数
                Object result=method.invoke(clazz.newInstance(),params);
    
                return result;
    
                //这里为了博客上简洁一些把其他catch都去掉了(复制代码的同学应该把其他异常的catch搞出来)
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
    }


    3、写一个main方法测试是否正确调用

    public static void main(String[] args) {
    	//我们测试要调用的hello方法只有一个String参数
    	Class[] paramTypes={String.class};
    		
    	//给hello方法传参数"World"
    	Object[] params={"World"};
    		
    	Object result=CallMethod.call("com.test.MyTest-hello",paramTypes,params);
    		
    	//已测试输出 "Hello World"
    	System.out.println((String)result);
    }

     

     

     

     

     

    展开全文
  • 前提:由对象获取一个.class对象:Class clazz = "...java.lang.String");学习的时候发现,int等基本数据类型不是对象,所以无法获得其class对象,使用过程中只能通过int.class获取正文...

    前提:

            由对象获取一个.class对象:

    Class clazz = "hello world".getClass();

            由对象的全包名获取一个.class对象:

    Class clazz=Class.forName("java.lang.String");

    学习的时候发现,int等基本数据类型不是对象,所以无法获得其class对象,使用过程中只能通过int.class获取

    正文:

    实体类

    package test;
    
    public class Student {
    	private static Student student = new Student();
    	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 void setAge(int age) {
    		this.age = age;
    	}
    	public void method1(int param1,String param2) {
    		System.out.println(param1+param2);
    	}
    	
    }

     

    测试类:

     

    package test;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Test {
    
    	public static void main(String[] args) throws Exception {
    		Student stu = new Student();
    		stu.setAge(1);
    		stu.setName("lin");
    		
    		//1.无参
    		Method method = stu.getClass().getMethod("getName");
    		String name = (String) method.invoke(stu);
    		
    		//2.一参
    		Method method2 = stu.getClass().getMethod("setName",Class.forName("java.lang.String"));
    		method2.invoke(stu, "meng");
    		
    		//3.多参
    		Method method3 = stu.getClass().getMethod("method1",int.class,Class.forName("java.lang.String"));//后两个参数获得的都是class对象
    		method3.invoke(stu,15, "zhang");
    	}
    }

     

    另附自写get和set函数:

     

    //参数列表:
    //1.目标所属对象 2.所用set函数名(全称不加()) 3.set值
    
    public void set(Info info,String fun,Object value) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
    		Method method = info.getClass().getMethod(fun,Class.forName(value.getClass().getCanonicalName()));
    		method.invoke(info, value);
    	}
    	
    public Object get(Info info,String fun) throws Exception {
    		Method method = info.getClass().getMethod(fun);
    		return method.invoke(info);
    	}

    使用过程中可自行将函数封装进模板类代替Info类

    由于Object无法接收int等基本数据类型,故在实体类中时可将类型声明为Integer

    public Integer getSex() {
    		return sex;
    	}
    public void setSex(Integer sex) {
    		this.sex = sex;
    	}
    public class Util<T> {
    
        public static<T> void set(T bean,String fun,Object value) throws Exception {
            Method method = bean.getClass().getMethod(fun,Class.forName(value.getClass().getCanonicalName()));
            method.invoke(bean, value);
        }
    
        public static<T> Object get(T bean,String fun) throws Exception {
            Method method = bean.getClass().getMethod(fun);
            return method.invoke(bean);
        }
    }
        public static void main(String[] args) throws Exception {
            ABean aBean = new ABean();
            Util.set(aBean,"setName","zhangsan");
            System.out.println(aBean.getName());
        }

     

     

     

    展开全文
  • JavaScript通过字符串调用方法

    千次阅读 2018-10-15 11:27:19
    同学:如何通过名称字符串调用方法呢? 我:不是可以通过反射吗? 同学:那(js)javascropt呢? 我:咦咦咦,等我想想!!!!!! 我(内心独白):这个咋个没有遇到过呢,好像以前遇到都是在java中,那么js没有有...

    同学:如何通过名称字符串调用方法呢?
    我:不是可以通过反射吗?
    同学:那(js)javascropt呢?
    我:咦咦咦,等我想想!!!!!!
    我(内心独白):这个咋个没有遇到过呢,好像以前遇到都是在java中,那么js没有有这种方法呢?咦好像以前用过字符串计算(eval(“1+2+3-1+1.3”)),可以直接对字符串计算的东西,这个可以吗?不管了百度一下在说!


    JavaScript eval() 函数 W3school官网的定义
    eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

    1. 进行常规的运算测试:值得注意的是,进行算数运算,的字符串必须是数字类型的字符串,即不可以包含非数字(空格除外,运算符除外)
    <html>
    <body>
    <script type="text/javascript">
     console.log("eval('1+2+3')="+eval("1+2+3"));
     console.log("eval('3&5')="+eval("3&5"));
    // console.log(eval("1+ 2+d"));错误的,不能包含非数字(空格除外,运算符除外)
    </script> 
    </body>
    </html>
    
    

    这里插入图片描述](https://img-blog.csdn.net/20181015110210857?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqY2MxMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

    1. 测试方法:通过传入(函数名称+参数)字符串,进行函数调用
    <html>
    <body> 
    <script type="text/javascript">
     console.log("eval('1+2+3')="+eval("1+2+3"));
     function fn(val){console.log(val)};//这里可以进行复杂的业务了
     eval("fn('我是测试strfn')");//也可以分开传递参数 eval("fn"+"('小白')");
     eval("fn"+"('小白')");
    </script> 
    </body>
    </html>
    

    在这里插入图片描述


    其他测试就不一一举例:小白大多测试都通过,最后添加异常,判断等处理,防止出现异常,eval还是有很多强制性,感觉容易出现错误,所以使用时,还是要小心一点。


    小白在此,谢谢大家指导。谢谢。

    展开全文
  • 之前浏览廖雪峰老师的个人博客网站,无意间发现了关于在Java8中获取参数的方法,随手一转《Java 8中获取参数名称》,没想到今天遇到一个功能,非常符合这种反射调用的使用场景。回看了这篇之前转载的文章,然后根据...

    引言

    之前浏览廖雪峰老师的个人博客网站,无意间发现了关于在Java8中获取参数的方法,随手一转《Java 8中获取参数名称》,没想到今天遇到一个功能,非常符合这种反射调用的使用场景。回看了这篇之前转载的文章,然后根据自己的理解完成了这个功能。

    场景描述

    功能其实并不复杂。一个设备表中有两个字段,A和B,希望既可以通过A来查找相应记录,又能够通过B来查找相应记录,但问题就在于A和B的样子非常相似,不仅类型相同,就连名字也几乎完全一样(lntDeviceType和ytDeviceType)。

    我在Repository中定义了两个方法,分别区分开不同设备类型的查询:

    public DeviceType findByYtDeviceType(String ytDeviceType);
    public DeviceType findByLntDeviceType(String lntDeviceType);

    可是如何在Service中区分应该调用哪个方法呢?第一个能想到的方法就是写死,通过一个值来区分是根据A字段来查询还是B字段来查询,像如下这种形式:

    public DeviceType findDeviceType(String column, String deviceTypeStr) {
        if(column.equals("yt")) {
    	return findByYtDeviceType(deviceTypeStr);
        } else if (column.equals("lnt")) {
    	return findByLntDeviceType(deviceTypeStr);
        } else {
            return null;
        }
    }

    上述代码,通过一个colum字符串来得知究竟是通过ytDeviceType字段来查询,还是通过lntDeviceType来查询。问题可以得到解决,但是如果增加了一个C字段怎么办?又增加了一个D字段呢?难道每加一个字段都要加一个else if 写死一个分支?

    解决办法——反射调用

    思考过后,我想到了通过反射的方式来实现这个功能:

    public DeviceType findByDeviceType(String deviceTypeTitle, String deviceType) {
    	// 校验deviceTypeTitle是否正确
    	try {
    		Set<String> deviceTypeColumSet = mapper.convertValue(new DeviceType(), Map.class).keySet();
    		if (!deviceTypeColumSet.contains(deviceTypeTitle))
    			return null;
    
    		String findBy = "findBy";
    		// 根据deviceTypeTitle查找对应方法名并调用方法
    		Method findByXxDeviceType = dtRepo.getClass().getMethod(findBy + StringUtils.capitalize(deviceTypeTitle),
    				String.class);
    		DeviceType deviceTypeBean = (DeviceType) findByXxDeviceType.invoke(dtRepo, deviceType);
    		logger.info("按类型查找设备类型deviceTypeTitle = " + deviceTypeTitle + "; deviceType = " + deviceType);
    		return deviceTypeBean;
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    
    	return null;
    }

    说明:try块的前三行代码主要是验证deviceTypeTitle是否在DeviceType类型的属性之列,比如DeviceType有A、B两个属性,那么如果deviceTypeTitle是A或者B就符合要求,如果是C就不可以了。StringUtils.capitalize方法主要是将deviceTypeTitle的首字母变为大写,然后加上前缀 “findBy” 从而得到Repository中的方法名

    因为不论是用哪个字段来查询,其方法名始终都是  “findByXxxx” ,那何不通过映射自动匹配到对应的方法然后调用呢?这个时候我突然回想起了之前转载的廖雪峰老师的博客《Java 8中获取参数名称》,简单回看之后果然可以解决我的问题,再进一步搜索相关资料之后完成了上述代码。

    可以看到我通过拼接一个“findBy”前缀,然后将传入的 deviceTypeTitle 首字母大写与前缀拼接后即可得到Repository中对应的方法名,然后我通过方法名即可进行调用,完全不需要担心未来扩展的问题。即便未来扩展新的设备类型字段,而只需要在Repository中按照 “findByXxxx” 命名规则新加一个查询即可,service中的分发请求完全不需要改动,岂不美哉?!

    综上,就是关于通过方法名称字符串映射调用方法的例子,希望能够对大家有所帮助,欢迎文末留言。

    展开全文
  • Java语言中字符串比较有两种方式:== 和equals()。 “==”比较的是针对两个String类型变量的引用,当两个String类型的变量指向同一个String对象(即同一个内存堆),则返回true。而equals()方法是对String对象封装...
  • java字符连接字符串数组 最近有人问我这个问题–在Java中使用+运算符连接字符串是否对性能不利? 这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗。 这些是我要研究的方法: 使用+运算符 ...
  • Java字符串中查找匹配的子字符串

    万次阅读 多人点赞 2017-05-07 15:25:25
    Java字符串中查找匹配的子字符串
  • java字符串截取,调用substring()方法

    万次阅读 多人点赞 2017-12-06 12:03:18
    substring() 方法返回字符串的子字符串。在java中 substring()方法有两种用法, 第一种 public String substring(int beginIndex) 第二种 public String substring(int beginIndex, int endIndex) 参数...
  • java字符串加入空格 我确定您处于想要连接多个字符串的情况。 如果您使用的不是Java编程语言,则可能使用了该编程语言提供的join()函数。 如果使用Java,则无法执行此操作。 没有join()方法。 Java标准类库为您...
  • Java字符串:matches() 方法

    千次阅读 2019-11-04 09:24:02
    matches() 方法用于检测字符串是否匹配给定的正则表达式。 调用方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同: Pattern.matches(regex, str) 语法 public boolean matches(String regex) ...
  • 参数name:所需调用方法的String类型 参数Class<?>... parameterTypes:是一个可变参数,为method方法中所需参数的class Method: Object invoke(Object obj, Object... args)   对带有指定参数...
  • Java字符串: toLowerCase() 方法

    千次阅读 2019-11-04 09:29:14
    toLowerCase() 方法字符串转换为小写。 语法 public String toLowerCase() 或 public String toLowerCase(Locale locale) 参数 无 返回值 转换为小写的字符串。 public class Test { public static void ...
  • Java字符串String类操作方法整理

    万次阅读 多人点赞 2018-04-28 01:06:48
    Java字符串提供了许多的可用方法调用这些方法可以在一定程度上加快程序的开发效率,这也就相当于Java已经给开发人员提供好了轮子,只要用轮子去造车子便可,所以这就是面向对象思想与面...
  • Java字符串拼接原理

    千次阅读 2020-05-25 17:12:15
    调用String的intern方法可以将String存入字符串常量池 2. 字面量的拼接原理 java源码 package com.hgy; import java.util.Arrays; import java.util.List; public class hello { public stati
  • 字符串调用change方法

    千次阅读 2018-08-19 22:46:45
    这个原来是因为在调用change方法时,str和ch传递的都是引用,在方法中修改了ch指向对象的内容,由于形参与实参指向相同的对象,因此通过形参对对象内容的修改对实参是可见的。对于str来说,修改的是引用本身,也就是...
  • java字符串转化为方法调用

    千次阅读 2010-07-07 13:32:00
    将一个字符串转化为java方法调用主要分为以下几个步骤:1、定义方法,本文示例定义了一个say的方法,该方法需要两个参数,一个是字符串的数组、一个是写文件的句柄。public void say(String[] str,PrintWriter pw)...
  • * java可以使用两种方法直接将字符数组转为字符串 * 方法1:直接在构造String时转换。 char[] data = {'a', 'b', 'c'}; String str = new String(data); * 方法2:调用String类的方法转换。 String.valueOf...
  • JAVA字符串常用api

    万次阅读 多人点赞 2017-02-14 17:51:53
    转载自字符串常用方法 和Java string字符串常用方法 字符串基本操作 1.substring(from,end)(含头不含尾) 截取一串字符串的一串子字符串,从from位置的字母(包括from)到end(不包括end位置)的字符串。 可以通过...
  • // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示; //得到字符串形式的hash值 //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方) return new BigInteger(1, md.digest...
  • java字符串 小结

    千次阅读 2021-01-24 18:17:15
    文章目录Java中char类型转换成int类型的两种方法Java中char和String的相互转换 Java中char类型转换成int类型的两种方法 方法一: char ch = '9'; if (Character.isDigit(ch)){ // 判断是否是数字 int num = Integer...
  • Java字符串模版

    千次阅读 2016-12-08 13:28:35
    Java字符串模版
  • java可以使用两种方法直接将字符数组转为字符串 方法1:直接在构造String时转换。 char[] data = {‘a’, ‘b’, ‘c’}; String str = new String(data); 方法2:调用String类的方法转换。 String.va...
  • java字符串中按下标插入字符串

    千次阅读 2020-03-24 16:26:08
    java 字符串操作API还是比较多的,针对于上述要求, 有substr charAt replace format等可供选择。 当调用频繁时,会实例化出较多对象。在这里,介绍下StringBuilder StringBuilder //指定插入 insert() //删除 ...
  • //import java.lang.reflect.Field; /** 获取Object对象,所有成员变量属性值 */ public static void getObjAttr(Object obj) { // 获取对象obj的所有属性域 Field[] fields = obj.getClass().getDeclaredFields()...
  • public int indexOf(int ch ) :返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 或 public int indexOf(int ch, int fromIndex) :返回从 fromIndex 位置开始查找指定字符在...
  • “南风知我意,吹梦到西洲” 很多时候我们需要对文本进行替换,简单地使用replace方法就可以了。复杂的就需要使用正则;java提供了正则相关的类Pattern 和... // 需要匹配的字符串 String str = ""; // 预编译
  • java字符串拼接

    万次阅读 2017-11-02 17:33:53
    这篇文章主要介绍了Java字符串拼接的一些细节分析,本文着重剖析了字符串拼接的一些性能问题、技巧等内容,需要的朋友可以参考下 工作日忙于项目的逻辑实现,周六有点时间,从书柜里拿出厚厚的英文版Thinking ...
  • JAVA字符串处理函数列表一览

    千次阅读 2017-05-13 21:41:16
    JAVA字符串处理函数列表一览Java中的字符串也是一连串的字符。但是与许多其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作String类型对象来处理。将字符串作为内置的对象处理允许Java提供十分丰富的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 726,915
精华内容 290,766
关键字:

java字符串调用方法

java 订阅