Java反射機制(創建Class對象的三種方式)
1:SUN提供的反射機制的類:
java.lang.Class<T>
java.lang.reflect.Constructor<T>
java.lang.reflect.Field
java.lang.reflect.Method
java.lang.reflect.Modifier
2:什么是反射
JAVA反射機制是在運行狀態中,對於任意一個類。都能都知道這個類的所有屬性和方法,對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱之為java語言的反射機制;
3:反射的作用
反編譯 .class --à .java
通過反射機制可以訪問java對象中的屬性,方法,構造方法
4:創建Class對象的三種方式
JavaBean:
public class Person implements China{
private String name;
private int age ;
private char sex ;
public Person() {
super ();
}
public Person(String name, int age, char sex) {
super ();
this .name = name;
this .age = age;
this .sex = sex;
}
public String getName() {
return name ;
}
public void setName(String name) {
this .name = name;
}
public int getAge() {
return age ;
}
public void setAge(int age) {
this .age = age;
}
public char getSex() {
return sex ;
}
public void setSex(char sex) {
this .sex = sex;
}
public void eat()
{
System. out .println("吃了" );
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]" ;
}
@Override
public void sayChina() {
// TODO Auto-generated method stub
System. out .println("作者:" + AUTHOR + "國籍:"+ NATIONAL );
}
@Override
public String sayHello(String name, int age, char sex) {
// TODO Auto-generated method stub
return "姓名:" + name + "年齡:"+ age + "性別:" + sex;
}
}
1 public class ClassDemo02 {
2
3 public static void main(String[] args) {
4 Person p1 = new Person("小明" ,20,'男' );
5 Person p2 = new Person("小紅" ,23,'女' );
6
7 //創建Class對象的方式一:(對象.getClass()),獲取person類中的字節碼文件
8 Class class1 = p1.getClass();
9 System. out.println(p1.getClass().getName());
10 Class class2 = p2.getClass();
11 System. out.println(class1 == class2 );
12
13 System. out.println("==============================" );
14 //創建Class對象的方式二:(類.class:需要輸入一個明確的類,任意一個類型都有一個靜態的class屬性)
15 Class class3 = Person.class;
16 System. out.println(class1 == class2);
17
18 System. out.println("==============================" );
19 //創建Class對象的方式三:(forName():傳入時只需要以字符串的方式傳入即可)
20 //通過Class類的一個forName(String className)靜態方法返回一個Class對象,className必須是全路徑名稱;
21 //Class.forName()有異常:ClassNotFoundException
22
23 Class class4 = null;
24 try {
25 class4 = Class.forName("cn.itcast.Person");
26 } catch (ClassNotFoundException e) {
27 // TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 System. out.println(class4 == class3);
31 }
32 }
注意:在開發中一般使用第三種方法,因為第三種接收的是一個字符串路徑,將來可以通過配置文件獲取,通用性好;
4:newInstance()方法 ---> 獲取class類型之后,可以創建該類型的對象
public T newInstance()throws InstantiationException,IllegalAccessException
1 public class reflect03 {
2
3 public static void main(String[] args) throws Exception {
4
5 Class c1 = Class.forName("com.itheima04.Test_20171106.Test_20171207.Person");
6
7 //創建此Class對象所表示類的一個新實例,
8 //newInstance方法調用的是Person的空參數構造方法
9 Object o = c1.newInstance();
10 System.out.println(o.toString());
11 }

