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

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值