您的位置:首页 > 编程语言 > Java开发

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.java

public 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();
}
}
}


运行结果:



希望对您有所帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: