1:SUN提供的反射機制的類:java
java.lang.Class<T>ide
java.lang.reflect.Constructor<T>this
java.lang.reflect.Fieldspa
java.lang.reflect.Methodcode
java.lang.reflect.Modifier對象
2:什麼是反射blog
JAVA反射機制是在運行狀態中,對於任意一個類。都能都知道這個類的全部屬性和方法,對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱之爲java語言的反射機制;開發
3:反射的做用字符串
反編譯 .class --à .javaget
經過反射機制能夠訪問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 }