`

关于java反射机制的代码注释和java反射对面向对象封装性破坏的说明

    博客分类:
  • J2SE
阅读更多

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,还要给出方法的实参。如果实参是简单类型,要把简单类型转换成包装类对象
       
}

}

分享到:
评论

相关推荐

    牛客网BAT算法精品课练习题答案,包括JAVA和C++两个版本,代码中附上大量注释帮助理解程序.zip

    面向对象:Java全面支持面向对象的特性,如封装、继承和多态,使得代码更易于维护和扩展。 安全:Java提供了丰富的安全特性,如禁止指针运算、自动内存管理和异常处理机制,以减少程序错误和恶意攻击的可能性。 ...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    疯狂JAVA讲义

    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文档是什么? ...

    java基础案例与开发详解案例源码全

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

    超爽的自学课件(java)

    1) 第1章:对象入门 这一章是对面向对象的程序设计(OOP)的一个综述,其中包括对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。...

    corejava培训文档

    6.1. 面向对象与面向过程 6.2. 对象的概念 6.3. 成员变量和局部变量 6.4. 成员方法 6.5. This关键字 6.6. 访问控制符 6.7. 构造方法 6.8. 数据和方法的隐藏―――封装 6.9. 方法的重载 7. 六 高级语言特性 ...

    java学习笔记 初学者必读

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

    corejavaNoteBook

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

    javaSE代码实例

    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 基本数据类型值间的...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    Java学习笔记-个人整理的

    {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} ...

Global site tag (gtag.js) - Google Analytics