反射基礎理論 實例

import java.io.Serializable;java


public class Car extends Demo1 implements Serializable,Cloneable{函數

public Car(){}this

public Car(String color) throws NullPointerException {this.color=color;}spa

private Car(String a,String b){}.net

private String color ;對象


public String desc;繼承

public static String desc2;接口

public void setColor(String color) {get

this.color = color;it

}



public String getColor() {

return color;

}


public static void run()throws ClassCastException,IndexOutOfBoundsException{

System.out.println("汽車跑!!滴滴!");

}



private String getDesc() {

return desc;

}

}



import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;


import org.junit.Test;


//Class

public class Demo1 {

@Test

public void fun1() throws Exception{

//1得到Class的方式

//1> 根據實例得到

Car car = new Car();

Class clazz1 = car.getClass();

//2>根據類得到

Class clazz2 = Car.class;

//3>根據完整類名

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

}

@Test

public void fun2() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

//2得到class能夠作什麼?

//1> 得到類中的信息

//得到類名

String  name1 = clazz3.getName();

String  name2 = clazz3.getSimpleName();

System.out.println(name1);

System.out.println(name2);

//得到類的修飾符

System.out.println(Modifier.toString(clazz3.getModifiers()));

//類的父類,接口

System.out.println(clazz3.getSuperclass().getName());

System.out.println(clazz3.getInterfaces().length);

//得到類中的構造方法

//如下兩個方法不能得到私有構造

Constructor con1  = clazz3.getConstructor(String.class);//指定參數得到構造

Constructor[] cons = clazz3.getConstructors();

System.out.println(con1.getName());//cn.itcast.reflect.Car

System.out.println(cons.length);//2

//得到私有構造

Constructor con2 = clazz3.getDeclaredConstructor(String.class,String.class);

Constructor[] cons2 =clazz3.getDeclaredConstructors();

System.out.println(cons2.length);//3

//得到類中的變量/字段

//得到公有屬性

Field f1 = clazz3.getField("desc");

Field[] fs1  = clazz3.getFields();

System.out.println(f1.getName());//desc

System.out.println(fs1.length);//1

//得到私有屬性

Field f2 = clazz3.getDeclaredField("color");

Field[] fs2  = clazz3.getDeclaredFields();

System.out.println(f2.getName());//color

System.out.println(fs2.length);//2

//得到類中的方法=> 類中全部公有方法(包含繼承來的)

Method m1 = clazz3.getMethod("run");

Method[] ms1 = clazz3.getMethods();

System.out.println(m1.getName());//run

System.out.println(ms1.length);//13

//得到類中的方法=> 得到類中的全部方法(包括私有)(不包括繼承的)

Method m2 = clazz3.getDeclaredMethod("getDesc");

Method[] ms2 = clazz3.getDeclaredMethods();

System.out.println(m2.getName());//getDesc

System.out.println(ms2.length);//3

}

@Test

public void fun3() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

//2> 建立實例

Car car = (Car) clazz3.newInstance();

car.run();

//注意:使用類的newInstance方法,只能調用空參構造.

}

}





import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;


import org.junit.Test;


//Constructor

public class Demo2 {

@Test

public void fun1() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

//1得到Constructor的方式

//如下兩個方法不能得到私有構造

Constructor con1  = clazz3.getConstructor(String.class);//指定參數得到構造

Constructor[] cons = clazz3.getConstructors();

System.out.println(con1.getName());//cn.itcast.reflect.Car

System.out.println(cons.length);//2

//得到私有構造

Constructor con2 = clazz3.getDeclaredConstructor(String.class,String.class);

Constructor[] cons2 =clazz3.getDeclaredConstructors();

System.out.println(cons2.length);//3

}

@Test

public void fun2() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

//public Car(String color)  {this.color=color;}

Constructor con1  = clazz3.getConstructor(String.class);//指定參數得到構造

//2得到Constructor能夠作什麼?

//1> 描述信息

//限定名稱   public 

System.out.println(Modifier.toString(con1.getModifiers()));

//構造方法名稱  

System.out.println(con1.getName());//cn.itcast.reflect.Car

//參數列表  String

Class[] ps = con1.getParameterTypes();

System.out.println(ps.length);//1

//得到拋出異常信息

Class[] es = con1.getExceptionTypes();

System.out.println(es.length);

System.out.println(es[0].getName());

}

@Test

public void fun3() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

//public Car(String color)  {this.color=color;}

Constructor con1  = clazz3.getConstructor(String.class);//指定參數得到構造

//2>根據構造函數建立實例

Car car = (Car) con1.newInstance("yellow");

System.out.println(car.getColor());//yellow

//--------私有構造函數調用-------------

//理論上不能使用私有構造建立對象

Constructor con2  = clazz3.getDeclaredConstructor(String.class,String.class);//指定參數得到構造

//設置能夠被訪問 ==> 不推薦,由於破壞了封裝性.

con2.setAccessible(true);

Car car2 = (Car) con2.newInstance("a","b");

}

}



import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;


import org.junit.Test;


//Method

public class Demo3 {

@Test

public void fun1() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

//1得到Method的方式

//得到類中的方法=> 類中全部公有方法(包含繼承來的)

Method m1 = clazz3.getMethod("run");

Method[] ms1 = clazz3.getMethods();

System.out.println(m1.getName());//run

System.out.println(ms1.length);//13

//得到類中的方法=> 得到類中的全部方法(包括私有)(不包括繼承的)

Method m2 = clazz3.getDeclaredMethod("getDesc");

Method[] ms2 = clazz3.getDeclaredMethods();

System.out.println(m2.getName());//getDesc

System.out.println(ms2.length);//3

}

@Test

public void fun2() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

// public void run(){ System.out.println("汽車跑!!滴滴!"); }

Method m1 = clazz3.getMethod("run");

//2得到Method能夠作什麼?

//1> 描述信息

//修飾符

System.out.println(Modifier.toString(m1.getModifiers()));//public

//返回值

System.out.println(m1.getReturnType().getName());//void

//方法名

System.out.println(m1.getName());//run

//參數列表

System.out.println(m1.getParameterTypes().length);//0

//拋出異常

System.out.println(m1.getExceptionTypes().length);//2

}

@Test

public void fun3() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

// public void setColor(String color) { this.color = color; }

Method m1 = clazz3.getMethod("setColor",String.class);

//2>使用方法能夠作什麼

Car car =new Car();

System.out.println(m1.invoke(car, "blue"));//null

System.out.println(car.getColor());//blue

//---私有方法調用--- setAccessable(true)

//---靜態方法調用--- 不須要對象

Method m2 = clazz3.getMethod("run");

m2.invoke(null);

}

}




import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;


import org.junit.Test;


//Field

public class Demo4 {

@Test

public void fun1() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

//1得到Field的方式

//得到公有屬性

Field f1 = clazz3.getField("desc");

Field[] fs1  = clazz3.getFields();

System.out.println(f1.getName());//desc

System.out.println(fs1.length);//1

//得到私有屬性

Field f2 = clazz3.getDeclaredField("color");

Field[] fs2  = clazz3.getDeclaredFields();

System.out.println(f2.getName());//color

System.out.println(fs2.length);//2

}

@Test

public void fun2() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

// public String desc;

Field f1 = clazz3.getField("desc");

//2得到Field能夠作什麼?

//1> 描述信息

//修飾符

System.out.println(Modifier.toString(f1.getModifiers()));//public

//類型

System.out.println(f1.getType().getName());//java.lang.String

//變量名稱

System.out.println(f1.getName());//desc

}

@Test

public void fun3() throws Exception{

Class clazz3 = Class.forName("cn.itcast.reflect.Car");

// public String desc;

Field f1 = clazz3.getField("desc");

//2>使用屬性能夠作什麼

Car car =new Car();

//設置值

f1.set(car, "haha");

//取出值

System.out.println(f1.get(car));//haha

//---操做靜態變量

Field f2 = clazz3.getField("desc2");

//設置值

f2.set(null, "haha");

//取出值

System.out.println(f2.get(null));//haha

System.out.println(Car.desc2);//haha

}

}

相關文章
相關標籤/搜索