1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 李兴华java开发实战经典-反射

李兴华java开发实战经典-反射

时间:2021-10-31 05:38:16

相关推荐

李兴华java开发实战经典-反射

1.获取类反射名称

class Ref{}public class RefectoryDemo {public static void main(String[] args) {Ref myref=new Ref();System.out.println(myref.getClass().getName());}}

结果:

fengray.Ref

2.通过反射创建一个泛型对象

反射机制用三种方法实例化一个对象

1、通过forName()方法(重点方式)

2、类.class(重点方式)

3、对象.getClass()

class Ref1{public Ref1() {System.out.println("constructe an object about Ref1");}public static void myprint() {System.out.println("do Ref1");}}class Ref2{public Ref2() {System.out.println("constructe an object about Ref2");}public void myprint() {System.out.println("do Ref2");}}public class RefectoryDemo {public static void main(String[] args) {Class <?> class1=null;Class <?> class2=null;Class <?> class3=null;try {class1=Class.forName("fengray.Ref1");//通过forName方式实例化} catch (ClassNotFoundException e) {e.printStackTrace();}class2=new Ref2().getClass();//通过object类中的方法实例化class3=Ref1.class;//通过类.class实例化System.out.println(class1.getName());System.out.println(class2.getName());System.out.println(class3.getName());}}

结果:

constructe an object about Ref2

fengray.Ref1

fengray.Ref2

fengray.Ref1

3.class类中方法的使用

一下案例中Person类必须存在无参构造方法,案例中Person类有一个默认的无参构造方法。如果仅有有参构造方法则无法完成(有参重载不在其列)

class Person{private String name;private int age;public Person() {}//包含无参构造函数public Person(String name,int age) {this.name=name;this.age=age;}public String toString() {return "姓名:"+this.name+"====年龄"+this.age;}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 class RefectoryDemo {public static void main(String[] args) {Class<?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}Person person=null;try {person=(Person)class1.newInstance();//实例化对象} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}person.setName("张三");person.setAge(30);System.out.println(person);}}

结果:

姓名:张三====年龄30

明确调用有参构造函数

class Person{private String name;private int age;//public Person() {}//包含无参构造函数public Person(String name,int age) {this.name=name;this.age=age;}public String toString() {return "姓名:"+this.name+"====年龄"+this.age;}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 class RefectoryDemo {public static void main(String[] args) {Class<?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}Person person=null;//使用有参构造方法Constructor<?> cons[]=null;cons=class1.getConstructors();try {person=(Person)cons[0].newInstance("张三",20);//实例化对象} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {e.printStackTrace();}System.out.println(person);}}

结果:

姓名:张三====年龄20

4.取得类中的所有接口

interface Japan{}interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China,Japan{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class RefectoryDemo {public static void main(String[] args) {Class<?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}Class <?> myClass[]=class1.getInterfaces();//以数组形式返回实现的全部接口for (int i = 0; i < myClass.length; i++) {System.out.println(myClass[i].getName());}}}

结果://输出了所有Person 类用到的接口

fengray.China

fengray.Japan

4.取得类所继承的父类

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class RefectoryDemo {public static void main(String[] args) {Class<?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}Class <?> class2=class1.getSuperclass();//取得父类,即Object类System.out.println(class2.getName());}}

结果:

java.lang.Object

5.取得类中的全部构造方法

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class RefectoryDemo {public static void main(String[] args) {Class<?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}Constructor<?>[] class2=class1.getConstructors();//取得类中的全部构造方法for (int i = 0; i < class2.length; i++) {System.out.println("输出构造方法:"+class2[i]);}}}

结果:

输出构造方法:public fengray.Person(java.lang.String)

输出构造方法:public fengray.Person(java.lang.String,int)

输出构造方法:public fengray.Person()

5.取得类中的构造方法的参数类型

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class RefectoryDemo {public static void main(String[] args) {Class<?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}Constructor<?>[] class2=class1.getConstructors();//取得类中的全部构造方法for (int i = 0; i < class2.length; i++) {System.out.println("输出构造方法:"+class2[i]+"修饰符为:"+Modifier.toString(class2[i].getModifiers()));Class<?> Param[]=class2[i].getParameterTypes();//得到构造方法中的全部参数for (int j = 0; j < Param.length; j++) {System.out.println("参数 "+j+" 类型为:"+Param[j]);}System.out.println("**********");}}}

结果为:

输出构造方法:public fengray.Person(java.lang.String)修饰符为:public

参数 0 类型为:class java.lang.String

输出构造方法:public fengray.Person(java.lang.String,int)修饰符为:public

参数 0 类型为:class java.lang.String

参数 1 类型为:int

输出构造方法:public fengray.Person()修饰符为:public

5.取得类中的全部方法(本类方法而非全部(含父类))

interface China{

public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);

}

class Person implements China{

private String name;

private int age;

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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}

}

public class RefectoryDemo {

public static void main(String[] args) {

Class<?> class1=null;

try {

class1=Class.forName(“fengray.Person”);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

Method[] methods=class1.getDeclaredMethods();//获得本类中的方法,如果使用getMethod()则可以获得全部方法Class<?> type=null;for (int i = 0; i < methods.length; i++) {type=methods[i].getReturnType();Parameter[] params=methods[i].getParameters();int modifer=methods[i].getModifiers();System.out.println("第 "+i+" 个方法 "+methods[i].getName()+" 类型为:"+type+" 修饰符为:"+Modifier.toString(modifer));for (int j = 0; j < params.length; j++) {System.out.println("参数为:"+params[j]);}System.out.println("*******************");}}

}

结果为:

第 0 个方法 getName 类型为:class java.lang.String 修饰符为:public

第 1 个方法 setName 类型为:void 修饰符为:public

参数为:java.lang.String arg0

第 2 个方法 getAge 类型为:int 修饰符为:public

第 3 个方法 setAge 类型为:void 修饰符为:public

参数为:int arg0

第 4 个方法 sayChina 类型为:void 修饰符为:public

第 5 个方法 sayHello 类型为:class java.lang.String 修饰符为:public

参数为:java.lang.String arg0

参数为:int arg1

6.取得类中的全部属性

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class RefectoryDemo {public static void main(String[] args) {Class<?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}java.lang.reflect.Field[] fields=class1.getFields();for (int i = 0; i < fields.length; i++) {Class<?> type=fields[i].getType();//得到属性类型int mo=fields[i].getModifiers();//得到修饰符的数字String priv=Modifier.toString(mo);//还原修饰符System.out.println("以下是公共属性===");System.out.println(priv+" ");System.out.println(type.getName()+" ");//得到属性类型System.out.println(fields[i].getName());//输出属性名称System.out.println("***************************");}}}

结果:

以下是公共属性===

public static final

java.lang.String

NATIONAL

以下是公共属性===

public static final

java.lang.String

AUTHOR

7.通过反射调用类中的方法

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class InvokeDemo {public static void main(String[] args) {Class <?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}try {Method method=class1.getMethod("sayChina");//找到sayChina方法method.invoke(class1.newInstance());//调用方法} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {e.printStackTrace();}}}

结果:

作者:张三,国籍:China

8.通过反射调用类中的带参带返回值的方法

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class InvokeDemo {public static void main(String[] args) {Class <?> class1=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}try {Method method=class1.getMethod("sayHello",String.class,int.class);//找到sayChina方法,并设置参数String string=null;string=(String) method.invoke(class1.newInstance(),"lisi",42);//调用方法System.out.println(string);} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {e.printStackTrace();}}}

结果:

lisi 您好! 我今年 42岁了

9.通过反射调用类中的setter和getter方法

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class InvokeDemo {public static void main(String[] args) {Class <?> class1=null;Object object=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}try {object=class1.newInstance();} catch (Exception e) {e.printStackTrace();}setter(object, "name", "ncepu", String.class);setter(object, "age", 32, int.class);getter(object, "name");getter(object, "age");}/** Object obj:要操作的对象* String att:要操作的属性* Object value:要设置的属性内容* Class<?> type:要设置的属性类型*/public static void setter(Object obj,String att,Object value,Class<?> type) {try {Method method=obj.getClass().getMethod("set"+initStr(att),type);method.invoke(obj,value);} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {e.printStackTrace();}}public static void getter(Object object,String att) {try {Method method=object.getClass().getMethod("get"+initStr(att));System.out.println(method.invoke(object));} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {e.printStackTrace();}}public static String initStr(String old) {String str=old.substring(0,1).toUpperCase()+old.substring(1);return str;}}

结果:

ncepu

32

10.通过反射调用类中的属性

interface China{public static final String NATIONAL="China";public static final String AUTHOR="张三";public void sayChina();public String sayHello(String name,int age);}class Person implements China{private String name;private int age;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 Person() {}public Person(String name) {this.name=name;}public Person(String name,int age) {this(name);this.age=age;}@Overridepublic void sayChina() {System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);}@Overridepublic String sayHello(String name, int age) {return name+" 您好! 我今年 "+age+"岁了";}}public class InvokeDemo {public static void main(String[] args) {Class <?> class1=null;Object object=null;try {class1=Class.forName("fengray.Person");} catch (ClassNotFoundException e) {e.printStackTrace();}try {object=class1.newInstance();} catch (Exception e) {e.printStackTrace();}Field nameField=null;Field ageField=null;try {nameField=class1.getDeclaredField("name");//取得本类属性ageField=class1.getDeclaredField("age");nameField.setAccessible(true);//设置属性可见(因为name和age为private访问限制)ageField.setAccessible(true);nameField.set(object,"zhangsan");ageField.set(object, 30);System.out.println("姓名:"+nameField.get(object));System.out.println("年龄:"+ageField.get(object));} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {e.printStackTrace();}}}

结果:

姓名:zhangsan

年龄:30

11.通过反射操作数组—取得数组信息并修改数组内容

public class InvokeDemo {public static void main(String[] args) {int temp[]= {1,2,3};Class<?> class1=temp.getClass().getComponentType();//取得数组class对象System.out.println("类型:"+class1.getName());System.out.println("数组长度:"+Array.getLength(temp));System.out.println("第一个元素内容:"+Array.get(temp,0));Array.set(temp,0,6);System.out.println("第一个元素内容:"+Array.get(temp,0));}}

结果:

类型:int

数组长度:3

第一个元素内容:1

第一个元素内容:6

Array类可以修改数组的大小(长度)

public class InvokeDemo {public static void main(String[] args) throws Exception {int temp[]= {1,2,3};int newTemp[]=(int[]) arrayInc(temp,5);print(newTemp);System.out.println("\n********************");String t[]= {"ncepu","tingshua","pku","normalU"};String nt[]=(String [])arrayInc(t, 8);print(nt);}//Array类可以修改数组的大小(长度)public static Object arrayInc(Object obj,int len) {Class <?> class1=obj.getClass();Class<?> arr=class1.getComponentType();//得到数组对象Object newObj=Array.newInstance(arr, len);//开辟新的大小int copy=Array.getLength(obj);System.arraycopy(obj,0,newObj,0,copy);//拷贝内容return newObj;}public static void print (Object obj) {Class<?> class2=obj.getClass();if (!class2.isArray()) {return;}Class<?> arr=class2.getComponentType();System.out.println(arr.getName()+"数组的长度是:"+Array.getLength(obj));for (int i = 0; i < Array.getLength(obj); i++) {System.out.print(Array.get(obj,i)+"**");}}}

结果:

int数组的长度是:5

12300**

java.lang.String数组的长度是:8

nceputingshuapkunormalUnullnullnullnull

12.静态代理操作

一个代理类为一个接口服务(实现)

interface Subject{public String say(String name,int age);}class RealSubject implements Subject{@Overridepublic String say(String name, int age) {return "姓名:"+name+" 年龄:"+age;}}class ProxySubject implements Subject{privateSubject sub=null;public ProxySubject(Subject sub) {this.sub=sub;}@Overridepublic String say(String name, int age) {return this.sub.say(name, age);}}public class InvokeDemo {public static void main(String[] args) throws Exception {Subject subject=new ProxySubject(new RealSubject());//通过代理实现了真实实现类String info=subject.say("zhangsan", 32);System.out.println(info);}}

结果:

姓名:zhangsan 年龄:32

13.动态代理操作

使用invocatonHandler接口作为最终操作类,替换掉ProxySubject(代理类)

动态生成一个代理操作

interface Subject{public String say(String name,int age);}class RealSubject implements Subject{@Overridepublic String say(String name, int age) {return "姓名:"+name+" 年龄:"+age;}}class MyIvocationHandler implements InvocationHandler{private Object obj;public Object bind(Object obj) {//绑定一个真实类this.obj=obj;//动态返回一个代理return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before();Object temp=method.invoke(this.obj, args);return temp;}public void before() {System.out.println("代理操作之前******");}}public class InvokeDemo {public static void main(String[] args) throws Exception {Subject subject=(Subject)new MyIvocationHandler().bind(new RealSubject());//通过代理实现了真实实现类String info=subject.say("zhangsan", 32);System.out.println(info);}}

结果:

代理操作之前******

姓名:zhangsan 年龄:32

14.工厂设计模式

interface Fruit{public void eatFruit();}class Apple implements Fruit{@Overridepublic void eatFruit() {System.out.println("****吃苹果****");}}class Orange implements Fruit{@Overridepublic void eatFruit() {System.out.println("*****吃桔子******");}}//工厂类class Factory{public static Fruit getInstance(String className) {Fruit fruit=null;if ("apple".equals(className)) {fruit=new Apple();}if ("orange".equals(className)) {fruit=new Orange();}return fruit;}}public class InvokeDemo {public static void main(String[] args) throws Exception {Fruit fruit=Factory.getInstance("orange");if (fruit!=null) {fruit.eatFruit();}}}

结果:

吃桔子*

使用反射改进的工厂类

interface Fruit{public void eatFruit();}class Apple implements Fruit{@Overridepublic void eatFruit() {System.out.println("****吃苹果****");}}class Orange implements Fruit{@Overridepublic void eatFruit() {System.out.println("*****吃桔子******");}}class Pear implements Fruit{@Overridepublic void eatFruit() {System.out.println("*****吃梨子******");}}//工厂类class Factory{public static Fruit getInstance(String className) {Fruit fruit=null;try {fruit=(Fruit) Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}if ("apple".equals(className)) {fruit=new Apple();}if ("orange".equals(className)) {fruit=new Orange();}return fruit;}}public class InvokeDemo {public static void main(String[] args) throws Exception {Fruit fruit=Factory.getInstance("fengray.Pear");if (fruit!=null) {fruit.eatFruit();}}}

结果:

吃梨子*

继续的改进,使用反射改进工厂类(解决包路径的问题)

结合使用配置文件(属性文件,如fruit.prooerties)来绝对生产哪个类如:

apple=fengray.Apple

orange=fengray.Orange

pear=fengray.Pear

通过读取属性文件的键值对就可以知道生产哪个类,避免输入过长的类路径

interface Fruit{public void eatFruit();}class Apple implements Fruit{@Overridepublic void eatFruit() {System.out.println("****吃苹果****");}}class Orange implements Fruit{@Overridepublic void eatFruit() {System.out.println("*****吃桔子******");}}class Pear implements Fruit{@Overridepublic void eatFruit() {System.out.println("*****吃梨子******");}}class Init{public static Properties getPro() {Properties pro=new Properties();File file=new File("d:"+File.separator+"fruit.properties");//找到属性文件if (file.exists()) {try {pro.load(new FileInputStream(file));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else {try {pro.setProperty("apple", "fengray.Apple");pro.setProperty("orange", "fengray.Orange");pro.setProperty("pear", "fengray.Pear");pro.store(new FileOutputStream(file), "FRUIT CLASS");} catch (Exception e) {e.printStackTrace();}}return pro;}}//工厂类class Factory{public static Fruit getInstance(String className) {Fruit fruit=null;try {fruit=(Fruit) Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}if ("apple".equals(className)) {fruit=new Apple();}if ("orange".equals(className)) {fruit=new Orange();}return fruit;}}public class InvokeDemo {public static void main(String[] args) throws Exception {Properties properties=Init.getPro();Fruit fruit=Factory.getInstance(properties.getProperty("apple"));if (fruit!=null) {fruit.eatFruit();}}}

配置文件:fruit.properties

apple=fengray.Apple

orange=fengray.Orange

pear=fengray.Pear

结果:

吃苹果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。