1. 程式人生 > >java基礎反射的學習

java基礎反射的學習

反射學習,所有基礎都很重要
認識Class類
    public final Class getClass()
以上方法返回值得型別是一個Class類,實際上此類事Java反射的源頭,
正常方式:引入需要的包.類 --->通過new例項化--->取得例項化物件
反射方式:例項化物件→ getClass()-->得到完整的包類名稱
    java中Object是一切類的父類,那麼所有類的物件實際上也就是java.lang.Class類的
例項
class X{

    }
    public class TestClass {

public static void main(String[] args) {
Class<?> class1 =null;
Class<?> class2=null;
Class<?> class3 =null;
try {
   class1 = Class.forName("com.test.ll.X");
System.out.println(class1.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
class2= new X().getClass();
System.out.println(class2.toString());
class3=X.class;
System.out.println(class3.toString());
}
}
Class類本身表示一個類的本身,此類中的方法定義、屬性定義等
Class類的使用
    通過無參構造例項化物件
public class Person {
    private int age;
    private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
public void sayHello(){
System.out.println("heihei");
}
public void sayHello1(String name,int i){
System.out.println("name"+name+"======"+i);
}
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> c=null;
Class<?> forName = Class.forName("com.test.ll.Person");
//這種方式需要有無參構造器,否則會丟擲異常
Person p =(Person) forName.newInstance();
p.setAge(5);
p.setName("haha");
System.out.println(p);
}
}
通用有參函式構造例項化物件
public class Person1 {
private int age;
private String name;
public Person1(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> c=null;
c=Class.forName("com.test.ll.Person1");
//獲取所有構造器
Constructor<?>[] constructors = c.getConstructors();
for (int i = 0; i < constructors.length; i++) {
Constructor<?> constructor = constructors[i];
System.out.println(constructor.toString());
}
Person1 p =(Person1) constructors[0].newInstance(30,"llll");
System.out.println(p);
//獲取類中所有的全部介面
Class<?>[] interfaces = c.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
System.out.println(interfaces[i].toString());
}
//獲取父類
Class<?> superclass = c.getSuperclass();
System.out.println(superclass.toString());
}
}
反射的應用取得類的結構
    Construtor :表示構造方法
Field:表示類的屬性
public class Testfield {
//反射操作屬性
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
Class<?> c =null;
c =Class.forName("com.test.ll.Person");
Person p = (Person) c.newInstance();//建立例項
Field fieldName=null;
Field fieldAge=null;
fieldName=c.getDeclaredField("name");
fieldAge=c.getDeclaredField("age");
fieldName.setAccessible(true);//將name 設定外部可呼叫
fieldName.set(p, "hi girl");
fieldAge.setAccessible(true);//將age 設定外部可呼叫
fieldAge.set(p, 16);
System.out.println(fieldName.get(p));
System.out.println(fieldAge.get(p));
}
}
Method :表示類的方法
public class TestMethod {
//反射呼叫方法
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> c =Class.forName("com.test.ll.Person");
Method method = c.getMethod("sayHello1",String.class,int.class);
/*try {
method.invoke(c.newInstance());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
method.invoke(c.newInstance(), "girl",18);
}
}
通過反射呼叫方法
    通過方法操作屬性
    public class HUO {
private int age;
private String name;


public HUO(int age, String name) {
super();
this.age = age;
this.name = name;
}


public int getAge() {
return age;
}


public void setAge(int age) {
this.age = age;
}


public String getName() {
return name;
}
        public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> c=null;
c=Class.forName("com.test.ll.Person1");
//獲取所有構造器
Constructor<?>[] constructors = c.getConstructors();
for (int i = 0; i < constructors.length; i++) {
Constructor<?> constructor = constructors[i];
System.out.println(constructor.toString());
}
   Field[] fields = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
//獲取屬性型別
Class<?> type = fields[i].getType();
System.out.println(type.toString());
int modifiers = fields[i].getModifiers();
System.out.println(modifiers);
String name2 = fields[i].getName();
System.out.println(name2.toString());
}
}
}
   public class TestArr {

//反射運算元組
    public static void main(String[] args) {
int temp[] ={1,5,6};
Class<?> c= temp.getClass().getComponentType();
System.out.println(c.getName());//陣列的名字
System.out.println(Array.getLength(temp));//陣列的長度
Array.set(temp, 0, 6);//change value
System.out.println(Array.get(temp, 0));
}
}
反射應用動態代理
    public interface Subject {
    public String sayHi(String name);
}
    public class RealSubject  implements Subject{
@Override
public String sayHi(String name) { 
return "hi,beatiful girl";
}
public static void main(String[] args) {
//建立代理類引數  //應用例如springaop,列印日誌
MyInvocationHandler handler = new MyInvocationHandler();
RealSubject sub = new RealSubject();
//例項化代理類
Subject bind =   (Subject) handler.bind(sub);
String sayHi = bind.sayHi("hhh");
System.out.println(sayHi);
}
}  
    public class MyInvocationHandler implements InvocationHandler{
    private Object obj;
    
public Object bind(Object obj) {
this.obj=obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}


@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
return method.invoke(this.obj, args);
}
}
反射在工廠中的應用
    interface Fruit{
public void eat();
}
class Apple implements Fruit{
@Override
public void eat() {
System.out.println("吃蘋果...");
}
}
class Factory{
public static Fruit getInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Class<?> forName = Class.forName(className);
return  (Fruit) forName.newInstance();
}
}
public class TestFactory {
//將反射應用到工廠
public static void main(String[] args) {
try {
Fruit instance = Factory.getInstance("com.test.ll.Apple");
if(instance!=null){
instance.eat();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}