用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.Constructorpublc 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.Methodpublic 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()
}
}