java 反射基本使用
2018-03-12 22:38
483 查看
概述:
JAVA程序在运行状态中,通过Java的反射机制,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。git示例代码地址
获取Class对象方法:
通过Class.forName()静态方法获取;Class peopleClz; try { peopleClz = Class.forName("model.People"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
通过对象的getClass()方法;
People people = new People(); Class <?>clazz = people.getClass();
java中任意类.class属性:
Class clazz = People.class; Class clazz1 = String.class;
反射获取属性:
父类Animal.javapublic class Animal { public int type; private void move(){ } public void eat(){ } }
子类People.java
public class People extends Animal{ private String address; int sex; protected String name; public int age; public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } private void testReflec(){ System.out.println("测试反射"); } }
获取属性示例代码:
public class TestReflection { public static void main(String args []){ Class peopleClz = null; try { peopleClz = Class.forName("model.People"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //获取People类所有共有属性: Field allPFields[] = peopleClz.getFields(); System.out.println("所有公有属性(包含父类):"); for(Field field :allPFields){ System.out.println(field); } //获取指定公有属性 try { Field ageField = peopleClz.getField("age"); System.out.println("指定公有属性:\n"+ageField); } catch (NoSuchFieldException | SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } //获取指定属性: try { Field addressField = peopleClz.getDeclaredField("address"); System.out.println("获取指定任意属性:\n"+addressField); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } //获取People类所有属性(不能获取父类): Field allFields[] = peopleClz.getDeclaredFields(); System.out.println("所有属性(不包含父类):"); for(Field field :allFields){ System.out.println(field); } } }
输出:
反射获取方法:
获取方法示例代码:public class TestReflection { public static void main(String args []){ Class peopleClz = null; try { peopleClz = Class.forName("model.People"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //获取所有公有方法 Method methods [] = peopleClz.getMethods(); System.out.println("获取所有公有方法(包含父类):"); for(Method method:methods){ System.out.println(method); } //获取指定公有方法 System.out.println("获取指定公有方法:"); try { Method setSex = peopleClz.getMethod("setSex", int.class); System.out.println(setSex); Method getSex = peopleClz.getMethod("getSex", null); System.out.println(getSex); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } //获取本类声明方法 Method dMethods [] = peopleClz.getDeclaredMethods(); System.out.println("获取本类所有方法(不包含父类):"); for(Method method:dMethods){ System.out.println(method); } //获取本类指定方法 System.out.println("获取指定声明方法:"); try { Method testReflec =peopleClz.getDeclaredMethod("testReflec", null); System.out.println(testReflec); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行结果:
后续:
反射获取构造方法:
获取构造方法示例代码:public class TestReflection { public static void main(String args []){ Class peopleClz = null; try { peopleClz = Class.forName("model.People"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Constructor cons [] = peopleClz.getConstructors(); System.out.println("获取所有公有构造方法(不包含父类)"); for(Constructor con:cons){ System.out.println(con); } System.out.println("获取指定公有构造方法(不包含父类)"); try { Constructor con1 = peopleClz.getConstructor(null); System.out.println(con1); Constructor con2 = peopleClz.getConstructor(int.class,String.class); System.out.println(con2); } catch (NoSuchMethodException | SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("获取指定构造方法"); try { Constructor con3 = peopleClz.getDeclaredConstructor(int.class,String.class,int.class); System.out.println(con3); } catch (NoSuchMethodException | SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } Constructor dCons [] = peopleClz.getDeclaredConstructors(); System.out.println("获取所有构造方法"); for(Constructor con:dCons){ System.out.println(con); } } }
运行结果:
反射使用示例:
public class TestReflection { public static void main(String args []){ Class peopleClz = null; try { peopleClz = Class.forName("model.People"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //调用构造方法生成对象 People people1=null; People people2 =null; bcc6 try { //反射生成对象 System.out.println("------------------------------------------------------------------------"); System.out.println("反射生成对象:"); //公有构造方法生成对象: Constructor con1= peopleClz.getConstructor(int.class,String.class); people1 = (People) con1.newInstance(10,"weiwei"); System.out.println("名字="+people1.getName()); //非公有构造方法生成对象: Constructor con2= peopleClz.getDeclaredConstructor(int.class,String.class,int.class); //注意调用私有构造方法一定要设置下面语句为true,否则报异常java.lang.IllegalAccessException; con2.setAccessible(true); people2 = (People) con2.newInstance(10,"wenwen",-100); System.out.println("名字="+people2.getName()+"\tsex ="+people2.getSex()); //反射操作对象属性 System.out.println("------------------------------------------------------------------------"); System.out.println("反射操作对象属性:"); try { Field field1 = peopleClz.getDeclaredField("sex"); //sex访问权限为defalut,需要设置下面语句为true。 field1.setAccessible(true); field1.set(people2, 100); System.out.println("sex ="+people2.getSex()); Field field2 = peopleClz.getDeclaredField("address"); field2.setAccessible(true); field2.set(people2, "Beijing in China"); System.out.println("address ="+field2.get(people2)); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } //反射操作对象方法 System.out.println("------------------------------------------------------------------------"); System.out.println("反射操作对象方法:"); Method method1 = peopleClz.getDeclaredMethod("setName", String.class); Method method2 = peopleClz.getDeclaredMethod("getName"); method1.invoke(people2, "王小波!"); Object objString = (String) method2.invoke(people2); System.out.println(objString); Method method3= peopleClz.getDeclaredMethod("testReflec"); method3.setAccessible(true); method3.invoke(people2, null); } catch (NoSuchMethodException | SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行结果:
希望对您有所帮助!
相关文章推荐
- java反射的基本使用
- java反射的基本使用
- java 反射的基本使用
- JAVA反射的基本使用
- Java反射基本使用方法 示例
- Java反射基本概述及使用方法
- java中反射基本的方法以及使用
- 加强eclipse的使用技巧。可变参数。基本数据类型自动装箱和拆箱。枚举。反射。数组反射的应用。ArrayList和HashSet。JavaBean
- java反射的基本使用
- java反射-java Class基本使用
- java中反射的基本使用方法
- java反射基本使用(得到类中属性、方法、构造方法)
- java反射基本使用操作
- 使用java反射优化Spring自动生成的DAO实现类!
- JAVA反射使用手记
- 使用Java 5特性来简化反射编程
- 使用反射简化ajax中的处理代码(Java版)
- H2数据库在JAVA(JDBC)中的基本使用
- 使用Java5特性来简化反射编程
- JAVA反射使用手记