A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

通过实例干掉所有反射问题,有反射问题的可以来看看
  1. package com.heima.reflection;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;

  7. public class Demo1_Reflection {
  8.         private String username;
  9.         private String password;
  10.         private int[] age;
  11.        
  12.         /**   
  13.          *  设置username  
  14.          * @param username username   
  15.          */
  16.         public void setUsername(String username) {
  17.                 this.username = username;
  18.         }
  19.        

  20.         /**   
  21.          *  设置password  
  22.          * @param password password   
  23.          */
  24.         private void setPassword(String password) {
  25.                 this.password = password;
  26.         }
  27.        
  28.         public static void Test01() throws ClassNotFoundException{
  29.                 Class c1 = Demo1_Reflection.class;
  30.                 Class c2 = Class.forName("com.heima.reflection.Demo1_Reflection");
  31.                
  32.                 //获取指定包名
  33.                 String package01 = c1.getPackage().getName();
  34.                 String package02 = c2.getPackage().getName();
  35.                 System.out.println("package01 = "  + package01);
  36.                 System.out.println("package02 = "  + package02);
  37.                
  38.                 //获取类的修饰符
  39.                 int mod = c1.getModifiers();
  40.                 String modifier = Modifier.toString(mod);
  41.                 System.out.println("modifier = " + modifier);
  42.                 //获取指定类的完全限定名
  43.                 String className = c1.getName();
  44.                 System.out.println("className = " + className);
  45.                 //获取指定类的父类
  46.                 Class superClazz = c1.getSuperclass();
  47.                 String superClazzName = superClazz.getName();
  48.                 System.out.println("superClazzName = " + superClazzName);
  49.                 //获取实现类的接口
  50.                 Class[] interfaces = c1.getInterfaces();
  51.                 for (Class class1 : interfaces) {
  52.                         System.out.println("interfacesName =" + class1.getName());
  53.                 }
  54.                 //获取指定类的成员变量
  55.                 Field[] fields = c1.getDeclaredFields();
  56.                 for (Field field : fields) {
  57.                         modifier = Modifier.toString(field.getModifiers());
  58.                        
  59.                         //获取字段的数据类型对应的Class对象
  60.                         Class type = field.getType();
  61.                         //获取字段名
  62.                         String name = field.getName();
  63.                         //如果是数组类型需要特别处理
  64.                         if(type.isArray()){
  65.                                 String arrType = type.getComponentType().getName() + "[]";
  66.                                 System.out.println(" " + modifier + " " + arrType + " " + name + ";");
  67.                         }else {
  68.                                 System.out.println("" + modifier + " " + type + " " + name + ";");
  69.                         }
  70.                 }
  71.                
  72.                 //获取类的构造方法
  73.                 Constructor[] constructors = c1.getDeclaredConstructors();
  74.                 for (Constructor constructor : constructors) {
  75.                         //构造方法名
  76.                         String name = constructor.getName();
  77.                         //获取访问修饰符
  78.                         modifier = Modifier.toString(constructor.getModifiers());
  79.                         System.out.println("" + modifier + " " + name + "(");
  80.                         //获取构造方法中的参数
  81.                         Class[] paramTypes = constructor.getParameterTypes();
  82.                         for(int i = 0;i < paramTypes.length;i++){
  83.                                 if(i > 0){
  84.                                         System.out.println(",");
  85.                                 }
  86.                                 if(paramTypes[i].isArray()){
  87.                                         System.out.println(paramTypes[i].getComponentType().getName() + "[]");
  88.                                 }else{
  89.                                         System.out.println(paramTypes[i].getName());
  90.                                 }
  91.                         }
  92.                         System.out.println(")");
  93.                 }
  94.                 //获取成员方法
  95.                 Method[] methods = c1.getDeclaredMethods();
  96.                 for (Method method : methods) {
  97.                         //获取方法的修饰符
  98.                         modifier = Modifier.toString(method.getModifiers());
  99.                         //获取方法的返回值类型
  100.                         Class returnType = method.getReturnType();
  101.                         if(returnType.isArray()){
  102.                                 String arrType = returnType.getComponentType().getName()+"[]";
  103.                                 System.out.println("" + modifier + " " + arrType + " " + method.getName() + "(");
  104.                         }else {
  105.                                 System.out.println("" + modifier + " " + returnType.getName() + " " + method.getName() + "(");
  106.                         }
  107.                         //获取参数列表
  108.                         Class[]         paramTypes = method.getParameterTypes();
  109.                         for(int i = 0;i < paramTypes.length;i++) {
  110.                                 if(i > 0) {
  111.                                         System.out.println(",");
  112.                                 }
  113.                                 if(paramTypes[i].isArray()){
  114.                                         System.out.println(paramTypes[i].getComponentType().getName() + "[]");
  115.                                 }else{
  116.                                         System.out.println(paramTypes[i].getName());
  117.                                 }
  118.                         }
  119.                         System.out.println(")");
  120.                 }
  121.                
  122.         }
  123.        
  124.         public static void Test02() throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
  125.                 //public Object invoke(Object obj,Object...args)
  126.                 //第一个参数代表对象
  127.                 //第二个参数代表执行方法上的参数
  128.            //若反射要调用类的某个私有方法,可以在这个私有方法对应的Mehtod对象上先调用setAccessible(true)
  129.                
  130.                 Class c1 = Demo1_Reflection.class;
  131.                 //利用反射来创建类的对象
  132.                 Demo1_Reflection d1 = (Demo1_Reflection)c1.newInstance();
  133.                 System.out.println("username ==" + d1.username);
  134.                 System.out.println("password ==" + d1.password);
  135.                 //给成员变量赋值
  136.                 Method method = c1.getDeclaredMethod("setUsername", String.class);
  137.                 method.invoke(d1, "java反射学习");
  138.                 System.out.println("username==" + d1.username);
  139.                 method = c1.getDeclaredMethod("setPassword", String.class);
  140.                 method.invoke(d1, "咪娜");
  141.                 System.out.println("password ==" + d1.password);
  142.                 //调用私有方法
  143.                 //method.setAccessible(true);
  144.                 //method.invoke(d1, "反射执行某个Private修饰的方法");
  145.                
  146.                
  147.                
  148.                
  149.         }
  150.        

  151.         public static void main(String[] args) throws Exception {
  152.                 Test01();
  153.                 Test02();
  154.         }
  155.        

  156. }
复制代码

2 个回复

倒序浏览
可以可以可以谢谢分享
回复 使用道具 举报
不明觉厉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马