Student 实体类:
package com.vision.reflect;
public class Student {
private String name;
private int age ;
public Student(){}
public Student(String name, int age) {
this.name =name;
this.age=age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String study(){
System.out.println("heqiang is studying");
return "good";
}
public String study(String name , int age){
System.out.println(name +" had been studied "+age+" years" );
if(age>=10){
return "very good";
}else{
return "normal";
}
}
}
基础反射类API测试package com.vision.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class testReflectAPI {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class c = Class.forName("com.vision.reflect.Student");
System.out.println("Class "+c.getSimpleName());
Field [] fs=c.getDeclaredFields();//获得包括私有属性在内的所有属性
for(Field f:fs){
System.out.println("\t"+f.getType().getSimpleName()+" "+f.getName());
}
Method [] ms =c.getDeclaredMethods();
for(Method m:ms){
System.out.print("\t"+m.getReturnType().getSimpleName()+" ");
System.out.print(m.getName()+"(");
Class [] ps=m.getParameterTypes();
for(Class p: ps){
System.out.print(p.getSimpleName()+"");//打印参数类型
}
System.out.println("}{}");
}
} catch (ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
反射的动态调用:
package com.vision.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class testReflect {
/**
* student类的属性name和age都是私有的,而且都没有get访问器,但通过反射依然能获取到其属性的值,所以说其破坏了对象的封装特性。
* @param args
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
*/
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchMethodException, InvocationTargetException {
Object s =new Student("heqiang",20);
Class c = s.getClass(); //获取类对象。
Field [] fs= c.getDeclaredFields(); //获取对象s的属性
for(Field f:fs){ //遍历
f.setAccessible(true); //设置属性的可访问性为TRUE,其实破坏了对象的封装性
System.out.println(f.getName()+"="+f.get(s));//f.get(s)获取属性的值,参数表示s对象的属性值。
// f.set(s, "xiaofei"); //设置属性的值
// System.out.println(f.getName()+"="+f.get(s));
}
//***********************反射对方法的调用
Class []ps ={String.class,int.class}; //类对象的数组
Class [] ps1 = {};
Method m =c.getDeclaredMethod("study", ps);//获取Student类的study方法调用getDeclaredMethod方法的参数意思是1.方法名,2.方法的参数列表,因为有时候有方法重载的情况,方法的参数列表用类对象的参数列表表示,如ps.
Method m1=c.getDeclaredMethod("study", ps1);
Object [] os={"Alex",new Integer(19)};
Object [] os1 ={};
Object result = m.invoke(s, os); //invoke方法本身有返回值是Object类型的
System.out.println(result);
m1.invoke(s, os1);//针对对象s来调用方法study,还要给出方法的实参。如果实参是简单类型,要把简单类型转换成包装类对象
}
}
分享到:
相关推荐
面向对象:Java全面支持面向对象的特性,如封装、继承和多态,使得代码更易于维护和扩展。 安全:Java提供了丰富的安全特性,如禁止指针运算、自动内存管理和异常处理机制,以减少程序错误和恶意攻击的可能性。 ...
本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...
2.3 Java的面向对象特征 36 2.3.1 一切都是对象 37 2.3.2 类和对象 37 2.4 本章小结 37 第3章 数据类型和运算符 38 3.1 注释 39 3.1.1 单行注释和多行注释 39 3.1.2 文档注释 40 学生提问:API文档是什么? ...
15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...
1) 第1章:对象入门 这一章是对面向对象的程序设计(OOP)的一个综述,其中包括对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。...
6.1. 面向对象与面向过程 6.2. 对象的概念 6.3. 成员变量和局部变量 6.4. 成员方法 6.5. This关键字 6.6. 访问控制符 6.7. 构造方法 6.8. 数据和方法的隐藏―――封装 6.9. 方法的重载 7. 六 高级语言特性 ...
6.1. 面向对象与面向过程 6-11 6.2. 对象的概念 6-12 6.3. 成员变量和局部变量 6-12 6.4. 成员方法 6-12 6.5. This关键字 6-13 6.6. 访问控制符 6-13 6.7. 构造方法 6-13 6.8. 数据和方法的隐藏―――封装 6-14 6.9....
6.1. 面向对象与面向过程 6-11 6.2. 对象的概念 6-12 6.3. 成员变量和局部变量 6-12 6.4. 成员方法 6-12 6.5. This关键字 6-13 6.6. 访问控制符 6-13 6.7. 构造方法 6-13 6.8. 数据和方法的隐藏―――封装 6-14 6.9....
2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17 2.2.4 boolean型 18 2.3 基本数据类型值间的...
动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...
{2.1.3}面向对象的编程}{47}{subsection.2.1.3} {2.2}继承}{48}{section.2.2} {2.2.1}super(), this()}{49}{subsection.2.2.1} {2.2.2}方法重写/覆盖}{50}{subsection.2.2.2} {2.3}修饰符}{51}{section.2.3} ...