認識JAVA反射機制
定義
JAVA反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。
Java****反射機制,可以實作以下功能:
①在運作時判斷任意一個對象所屬的類;
②在運作時構造任意一個類的對象;
③在運作時判斷任意一個類所具有的成員變量和方法;
④在運作時調用任意一個對象的方法;
⑤生成動态代理。
擷取Class對象
public class Source {
public static void main(String[] args) {
//第一種方式:對象.class
Source s=new Source();
Class<?>c1=s.getClass();
//第二種方式:類.class
Class<?>c2=Source.class;
//第三種方式(推薦方式):
Class.forName(包名.類名)
Class<?>c3=null;
try{
c3=Class.forName("com.llllt.ref.simple.Source"); } catch (ClassNotFoundException e)
{ e.printStackTrace(); }System.out.println(c1.getName()); System.out.println(c2.getName()); System.out.println(c3.getName()); } }
擷取完class對象之後就可以擷取一系列東西
擷取構造器
public class ReflectDemo {
public static void main(String[] args) throws Exception {
testConstructor(User.class);
}
public static void testConstructor(Class cls) throws Exception {
Constructor con=cls.getConstructor(String.class,int.class);
System.out.println(con);
//擷取所有構造器
Constructor[] cons = cls.getDeclaredConstructors();
for(Constructor c:cons) {
System.out.println(c);
}
//建立對象
User user1= (User) cls.newInstance();
System.out.println(user1);
//使用私有構造器初始化
cons[1].setAccessible(true);
User user2= (User) cons[1].newInstance("song");
cons[1].setAccessible(false);
System.out.println(user2);
}
}
擷取方法與調用方法
public static void methodtest(Class cls) throws Exception {
//擷取方法
Method[] methods = cls.getDeclaredMethods();
System.out.println(Arrays.toString(methods));
User user = (User) cls.newInstance();
Method method2 = cls.getMethod("setAge",int.class);
System.out.println(method2);
//調用方法
method2.invoke(user,10);
System.out.println(user);
//成員
//靜态
}
設定屬性
public static void filedtest(Class<User> cls) throws Exception {
Field field = cls.getDeclaredField("name");
System.out.println(field);
User user = cls.newInstance();
field.setAccessible(true);
field.set(user,"宋芳強");
System.out.println(user);
//field.setAccessible(false);
//System.out.println(field.get(user));
}