Java反射机制获取set()方法 并且为set()方法传值

Java反射机制获取set()方法 并且为set()方法传值,第1张

ClassgetDeclaredMethod() 是获取这个类中所有的方法,返回的是Method[]如果有参数,第1个是方法名称,第2个是该方法的所有参数数组,这样返回的是Method这个对象Methodinvoke() 传入调用方法的类,另一个是调用这个方法所需要的参数,如果该方法没有参数,可以不填写,在JDK1,4之前,第2个参数是传入一个数组的,但是在jdk15之后,可以不传数组,多个参数用逗号隔开 不知道你听明白没

java在当前方法内部想得到当前方法参数类型列表,可以通过对该方法所在的类进行反射来得到当前方法的参数列表。对当前对象进行反射可以得到类中所有成员变量和方法的对象数组,对当前方法的名字与方法数组进行比较,得到相同名字的方法(即当前方法),然后通过使用该方法对象的方法来获得参数列表。

反射:在运行状态下,通过class文件对象,去使用构造方法,成员变量,成员方法

方法有三种:

1类名class

2对象getclass()

3classforName("包名类名")

好处:

只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法,包括私有的

同步方法

反射成员方法:

1获取字节码文件

Class c = ClassforName("包名类名");

2反射方法

Method m = cgetMethod("反射的方法",方法的参数类型class);

3用方法,minvoke(对象,参数) 对象,cnewInstance ,在A建立对象。

minvoke(cnewInstance(),参数);

类加载器与反射有什么关系

反射是通过字节码文件对象,将类的字段,方法,构造器等映射成相应的类,并进行各自的 *** 作;

类加载器是通过某个类的classLoader()方法,将该类的class文件从硬盘中加载到java虚拟机中,形成字节码文件;

构造函数和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);

}

}

用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();

    }

}

首先,请您先理解一下反射的基本原理否则我下述的代码您可能有点摸不着头脑

反射是NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型了如指掌。另外还可以直接创建对象,即使这个对象的类型在编译时还不知道。

反射的基本过程如下,请您务必阅读完毕后我将给你写出对应的代码

(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 

    (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 

    (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。 

    (4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。

    (5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。

    (6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。 

    (7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。 

    (8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

//加载程序集(dll文件地址),使用Assembly类   

Assembly assembly = AssemblyLoadFile(AppDomainCurrentDomainBaseDirectory + "Bin/App_Codedll");  

  

//获取类型,参数(名称空间+类)   

Type type = assemblyGetType("assembly_nameassembly_class");  

  

//创建该对象的实例,object类型,参数(名称空间+类)   

object instance = assemblyCreateInstance("assembly_nameassembly_class");  

  

//设置Show_Str方法中的参数类型,Type[]类型;如有多个参数可以追加多个   

Type[] params_type = new Type[1];  

params_type[0] = TypeGetType("SystemString");  

//设置Show_Str方法中的参数值;如有多个参数可以追加多个   

Object[] params_obj = new Object[1];  

params_obj[0] = "jiaopeng";  

  

//执行Show_Str方法   

object value = typeGetMethod("Show_Str", params_type)Invoke(instance, params_obj);

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对象数组)

public class refP{

public static void main(String[] args)

{

Class userClass=Stringclass;//将此处换成你的class 就成了

//---- 获取所有构造方法

Constructor[] cons=userClassgetDeclaredConstructors();

Systemoutprintln("类User的构造方法包括: ");

//---- 打印出构造方法的前缀

for (int i=0;i<conslength;i++)

{

Constructor con=cons[i]; //取出第i个构造方法。

Systemoutprint(ModifiertoString(congetModifiers()));

//---- 打印该构造方法的前缀修饰符

Systemoutprint(" "+congetName()+"("); //打印该构造方法的名字

//---- 打印该构造方法的参数。

Class[] parameterTypes=congetParameterTypes(); //构造方法参数集但是 数组类型显示特殊

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

{

Systemoutprint(parameterTypes[j]getName());

}

Systemoutprintln(")");

}

}

}

/核心语句:

Class userClass=Stringclass;//找到对应的class类

Constructor[] cons=userClassgetDeclaredConstructors();//找到对应的构造器数组

Class[] parameterTypes=congetParameterTypes(); //找到每个构造器对应的参数类型数组

以上就是关于Java反射机制获取set()方法 并且为set()方法传值全部的内容,包括:Java反射机制获取set()方法 并且为set()方法传值、java 怎么在当前方法内部得到当前方法的参数类型列表、反射是什么反射获取字节码文件的三种方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存