java 反射获得方法名后怎样判断方法是否含有参数

java 反射获得方法名后怎样判断方法是否含有参数,第1张

public static void printMethods(Class cl)

{

Method[] methods =clgetDeclaredMethods();//返回一个包含方法对象的数组

for(Method m : methods)//循环该类的每个方法

{

Class retType = mgetReturnType();//该方法的返回类型,

Sting name = mgetName();//获得方法名

Systenoutprint(" "+ModifiertoString(mgetModifiers());打印方法修饰符

Systemoutprint(" "+retTypegetName() + " " + name +"(");

Class[] paramTypes = mgetParameterTypes();//获得一个方法参数数组(getparameterTypes用于返回一个描述参数类型的Class对象数组)

for(int j = 0 ; j < paramTypeslength ; j++)

{

if ( j > 0 ) Systemoutprint(" , "); //如果有多个参数,中间则用逗号隔开,否则直接打印参数

Systemoutprint (paramTypes[ j ]getName);

}

Systemoutprintln (" );");

}}

//////////getparameterTypes方法用于返回一个描述参数类型的Class对象数组)

用ClassforName方法动态加载构造方法带参数的类。

1、在用ClassforName方法动态加载构造方法带参数的类时,为了将参数传递进去,可以考虑java的反射机制,比如有一个类如下:

public class Cat{

                    private int age;

                    private String name;

                    public void Cat(String name, int age){

                           thisname = name;

                           thisage = age;

                   }

        }

2、如果想用ClassforName方法动态加载这个类,可以用以下类似的代码实现:

 import javalangreflectConstructor;

        publc class LoadCat{

                    private int age;

                    private String name;

                    public void LoadCat(String name, int age){

                           super();

                           thisname = name;

                           thisage = age;

                   }

                   public static void main(String args[ ]){

                             Class clazz = ClassforName("Cat");

                             Constructor constructor = clazzgetConstructor(Stringclass, intclass);

                             LoadCat test = (LoadCat) constructornewInstance("test", 1);

                   }

        }

3、补充:

(1)反射方式调用对象类的由参构造方法!

(2)调用者与被调用者不在同包中(SpecialCalendar位于Calendar包中) 

调用者使用ClassforName()方法,应该显示的注明路径(包名) 

Class<> special = ClassforName("CalendarSpecialCalendar"); 

Constructor<> special_Calendar = 

specialgetConstructor(intclass,intclass,intclass); 

specialCalendar = (SpecialCalendar) 

special_CalendarnewInstance(2011,5,27);

4、方法二:

package comsanmao10;import javalangreflectConstructor;public class test2 {

    /

      ###2705_反射(通过反射获取带参构造方法并使用)

      Constructor

      Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数,

      就不能这样创建了,可以调用Class类的getConstructor(Stringclass,intclass)

      方法获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象/

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

        Class clazz=ClassforName("comsanmao10Person");//        Person p=(Person)clazznewInstance();    //通过无参构造创建对象//        psay();

        Constructor c=clazzgetConstructor(Stringclass,intclass);//获取有参构造

        Person p=(Person) cnewInstance("sanmao",12);    //通过有参构造创建对象

        psay();

    }

}

java反射调用可变参数的方法的方式是传入objects参数,如下代码:

public class Reflect {

 

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

        Class<> clazz = Singleclass;

        Single single = (Single) clazznewInstance();

        List<String> list = new ArrayList<String>(){

            private static final long serialVersionUID = 1L;

            {

                add("fuck");

                add("ni");

                add("mei");

            }

        };

         

        //获取method两种方式, 在method中 数组的的空间大小是可以随便写的不一定使用0

        / 1 /

        Method method = clazzgetDeclaredMethod("method", ArraynewInstance(Objectclass, 0)getClass());

        / 2 /

        method = clazzgetDeclaredMethod("method", (new Object[0])getClass());

 

 

         

        //初始化参数

        / 1 /

        Object objs = ArraynewInstance(Objectclass, 2);

        Arrayset(objs, 0, list);

        Arrayset(objs, 1, "23");

        methodinvoke(single, objs);

         

        / 2 /

        Object[] objects = {1, "fuck", list};

        methodinvoke(single, new Object[]{ objects });

    }

}

 

class Single {

    public void method(Object objs) {

        Systemoutprintln(ArraysdeepToString(objs));

    }

}

 

结果:

[[fuck, ni, mei], 23]

[1, fuck, [fuck, ni, mei]]

构造函数和method类似,介绍一下获取method的方法。首先定义个类,里面定义两个方法。

public class TestRflectionFather {

public void showarray(String[] str){

for(String ss:str){

Systemoutprintln(ss);

}

}

public void showarray(){

Systemoutprint("this is no param method");

}

}

获取并运行String[]为参的方法

import javalangreflectMethod;

public class Testmain {

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

Class clazz = ClassforName("TestRflectionFather");

Object fa= clazznewInstance();

Class[] cla = new Class[1];

Object[] obj= new Object[1];

String[] str ={"aaa","bbb","ccc"};

cla[0]=String[]class;

Method me=clazzgetMethod("showarray", cla);

obj[0]=str;

meinvoke(fa, obj);

}

}

获取并运行无参的方法

import javalangreflectMethod;

public class Testmain {

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

Class clazz = ClassforName("TestRflectionFather");

Object fa= clazznewInstance();

Method me=clazzgetMethod("showarray");

meinvoke(fa);

}

}

ClassgetDeclaredMethod()

是获取这个类中所有的方法,返回的是Method[]

如果有参数,第1个是方法名称,第2个是该方法的所有参数数组,这样返回的是Method这个对象

Methodinvoke()

传入调用方法的类,另一个是调用这个方法所需要的参数,如果该方法没有参数,可以不填写,在JDK1,4之前,第2个参数是传入一个数组的,但是在jdk15之后,可以不传数组,多个参数用逗号隔开

不知道你听明白没

以上就是关于java 反射获得方法名后怎样判断方法是否含有参数全部的内容,包括:java 反射获得方法名后怎样判断方法是否含有参数、JAVA反射中通过Class.forname()如何带参数的方法怎么赋值和调用呀、如何通过java 反射 调用一个 含有 可变参数的 方法呢 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9829744.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存