声明:下面代码为仿照视频所有,因为笔误原因,发现了个问题,原因不明,哪位朋友看后帮忙解释一下,谢谢
1
import java.lang.reflect.Field;
2
import java.lang.reflect.Method;
3
4
public class ReflctTester
{
5
6
public Object copy(Object object) throws Exception
{
7
Class<?> classType = object.getClass();
8
System.out.println("Class :"+ classType.getName());
9
//默认构造方法必须为public,不明白为什么换作friendly,protected却不行,而显示的构造方法却可以
10
Object objectCopy = classType.getConstructor(new Class[]
{}).newInstance(new Object[]
{});
11
Field fields[] = classType.getDeclaredFields();
12
for(int i=0;i<fields.length;i++)
{
13
Field field = fields[i];
14
String fieldName = field.getName();
15
String firstLetter = fieldName.substring(0,1).toUpperCase();
16
String getMethodName = "get"+firstLetter+fieldName.substring(1);
17
String setMethodName = "set"+firstLetter+fieldName.substring(1);
18
Method getMethod = classType.getMethod(getMethodName,new Class[]
{});
19
Method setMethod = classType.getMethod(setMethodName, new Class[]
{field.getType()});
20
Object value = getMethod.invoke(object, new Object[]
{});
21
System.out.println(fieldName+":" + value);
22
setMethod.invoke(objectCopy,new Object[]
{value});
23
}
24
return objectCopy;
25
}
26
27
public static void main(String[] args) throws Exception
{
28
Customer customer = new Customer("Tom", 21);
29
customer.setId(new Long(1));
30
Customer customerCopy = (Customer) new ReflctTester().copy(customer);
31
System.out.println("Copy information:" + customerCopy.getId() + " " + customerCopy.getName() + " " +customerCopy.getAge());
32
}
33
34
}
35
36
class Customer
{
37
private Long id;
38
private String name;
39
private int age;
40
protected Customer()
{}
41
public Customer(String name,int age)
{
42
this.name = name;
43
this.age = age;
44
}
45
public int getAge()
{
46
return age;
47
}
48
public void setAge(int age)
{
49
this.age = age;
50
}
51
public Long getId()
{
52
return id;
53
}
54
public void setId(Long id)
{
55
this.id = id;
56
}
57
public String getName()
{
58
return name;
59
}
60
public void setName(String name)
{
61
this.name = name;
62
}
63
}
上面的例子中如果默认的构造方法不为public则报
Exception in thread "main" java.lang.NoSuchMethodException: <init>()异常
问一个朋友得知:<init>()这个就是默认构造方法的签名
而<cinit>() 是类的初始化方法签名,第一次加载类时报错