JAVA反射中通过Class.forname()如何带参数的方法怎么赋值和调用呀?

Python020

JAVA反射中通过Class.forname()如何带参数的方法怎么赋值和调用呀?,第1张

用Class.forName方法动态加载构造方法带参数的类。

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

public class Cat{

                    private int age

                    private String name

                    public void Cat(String name, int age){

                           this.name = name

                           this.age = age

                   }

        }

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

 import java.lang.reflect.Constructor

        publc class LoadCat{

                    private int age

                    private String name

                    public void LoadCat(String name, int age){

                           super()

                           this.name = name

                           this.age = age

                   }

                   public static void main(String args[ ]){

                             Class clazz = Class.forName("Cat")

                             Constructor constructor = clazz.getConstructor(String.class, int.class)

                             LoadCat test = (LoadCat) constructor.newInstance("test", 1)

                   }

        }

3、补充:

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

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

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

Class<?> special = Class.forName("Calendar.SpecialCalendar") 

Constructor<?> special_Calendar = 

special.getConstructor(int.class,int.class,int.class) 

specialCalendar = (SpecialCalendar) 

special_Calendar.newInstance(2011,5,27)

4、方法二:

package com.sanmao10import java.lang.reflect.Constructorpublic class test2 {

    /**

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

     * Constructor

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

     * 就不能这样创建了,可以调用Class类的getConstructor(String.class,int.class)

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

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

        Class clazz=Class.forName("com.sanmao10.Person")//        Person p=(Person)clazz.newInstance()    //通过无参构造创建对象//        p.say()

        Constructor c=clazz.getConstructor(String.class,int.class)//获取有参构造

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

        p.say()

    }

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

public class Reflect {

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

Class<?>clazz = Single.class

Single single = (Single) clazz.newInstance()

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

private static final long serialVersionUID = 1L

{

add("fuck")

add("ni")

add("mei")

}

}

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

/* 1 */

Method method = clazz.getDeclaredMethod("method", Array.newInstance(Object.class, 0).getClass())

/* 2 */

method = clazz.getDeclaredMethod("method", (new Object[0]).getClass())

//初始化参数

可以的,参数类型是没有限制的。通过以下代码可以证明。

接口:

public interface MyInterface {

    void print()

}

实现类:

public class MyInterfaceImpl implements MyInterface {

    @Override

    public void print() {

        System.out.println("interfaceImpl")

    }

}

通过反射调用方法:

import java.lang.reflect.Method

public class Test {

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

        Test instance = Test.class.newInstance()

        Method method = Test.class.getDeclaredMethod("test", MyInterface.class)

        MyInterface myInterface = new MyInterfaceImpl()

        method.invoke(instance, myInterface)

    }

    public void test(MyInterface myInterface) {

        myInterface.print()

    }

}