• Java学习笔记之反射


    写出获取对象名的三种方法:

    方法一

    1 Student s=new Student();
    2 System.out.println(s.getClass());

    方法二

    1 Class sClazz=Student.class;
    2 System.out.println(sClazz);

    方法三(反射)

    1 Class clazz=Class.forName("com.blb.reflect.Student");
    2 String clazzname=clazz.getName();
    3 System.out.println(clazzname);

    反射的定义:反射式在java程序运行时,我还能动态的得到某个对象的所有属性和方法信息。并且可以动态执行某个对象的指定方法,或修改指定属性。这就是反射。

    通过反射访问类

    获取访问修饰符权限:

    1 int clazzModifier=clazz.getModifiers();    //Modifier,可以进去查看访问修饰符对应的整型,二进制1,0表示,可以进行权限叠加
    2 System.out.println(clazzModifier);

    返回源代码中给出的底层类的简称:

    1 String sinpleName=clazz.getSimpleName();
    2 System.out.println(sinpleName);

    获取父类对应的class:

    1 Class superClass=clazz.getSuperclass();
    2 System.out.println(superClass);

    newInstance会去找无参的构造方法构造对象:

    1 Student s1=  (Student) clazz.newInstance();

    构造器会根据的参数去匹配不同的构造方法,包括无参构造:

    1 Constructor<Student> c=clazz.getConstructor(int.class);
    2 Student s2=c.newInstance(123);

    但当我们不知道构造方法的详细情况时,通过以下方法获取它的结构:

    1 Constructor [] consList=clazz.getConstructors();
    2         for (Constructor con: consList) {
    3             //类名和构造方法参数数量
    4             System.out.println(con.getName()+"<---->"+con.getParameterCount());
    5             Class [] paramentType=con.getParameterTypes();
    6             for (Class pt : paramentType) {
    7                 System.out.println(pt.getName());
    8             }
    9         }

    通过反射访问类的属性

     1 public class Demo02 {
     2     //通过反射访问类的属性
     3     public static void main(String[] args) throws Exception {
     4         Class clazz=Class.forName("com.blb.reflect.Student");
     5         Student s1=  (Student) clazz.newInstance();
     6         //访问公有属性
     7         Field f=clazz.getField("sex");
     8         System.out.println(f.getType()+"---"+f.getName());
     9         //设置属性值
    10         f.set(s1,"男");
    11         //获取属性值
    12         System.out.println(f.get(s1));
    13         
    14         //获取所有公共属性,包括父类的
    15         Field [] fs=clazz.getFields();
    16         for (Field field : fs) {
    17             System.out.println(field.getName());
    18         }
    19         
    20         //访问私有属性
    21         System.out.println("======================================");
    22         Field fd=clazz.getDeclaredField("number");
    23         System.out.println(fd.getType()+"---"+fd.getName());
    24         
    25         //设置私有属性访问权限
    26         fd.setAccessible(true);
    27         //设置属性值
    28         fd.set(s1, 100);
    29         //获取属性值
    30         System.out.println(fd.get(s1));
    31         //获取当前类的所有属性(公有,私有),不包括父类的
    32         Field [] fs1=clazz.getDeclaredFields();
    33         for (Field field : fs1) {
    34             System.out.println(field.getName());
    35         }
    36         
    37 
    38     }
    39 
    40 }

    通过反射访问类的方法

     1 public class Demo03 {
     2     //通过反射访问类的方法
     3     public static void main(String[] args) throws Exception {
     4         
     5         Class clazz=Class.forName("com.blb.reflect.Student");
     6         //反射初始化实例对象
     7         Student s=(Student) clazz.newInstance();
     8         //返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法,由参数匹配对应方法
     9         Method md=clazz.getMethod("study", int.class);
    10         //调用方法
    11         md.invoke(s, 4);
    12         //返回一个 Method数组
    13         Method [] mds=clazz.getMethods();
    14         for (Method method : mds) {
    15             System.out.println(method.getName());
    16         }
    17 //        System.out.println(md.getName());
    18         
    19 //        Method md1=clazz.getMethod("study");
    20 //        md1.setAccessible(true);
    21 //        md1.invoke(s);
    22         
    23         //返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法
    24         Method mdd=clazz.getDeclaredMethod("study", String.class);
    25         //设置权限
    26         mdd.setAccessible(true);
    27         mdd.invoke(s, "男");
    28         //返回一个 Method数组
    29         Method [] mdds=clazz.getDeclaredMethods();
    30         for (Method method : mdds) {
    31             System.out.println(method.getName());
    32         }
    33     }
    34 
    35 }

    web服务器 提供web资源访问的服务,模拟apache的Tomcat

    Tomcat类:

     1 public class Tomcat {
     2     
     3     public static void main(String[] args) throws Exception{
     4         System.out.println("输入索引:");
     5         Scanner sc=new Scanner(System.in);
     6         String s=sc.next();
     7         //从配置文件读取信息
     8         Properties p=new Properties();
     9         FileInputStream fis=new FileInputStream(new File("src/tomcat.properties"));
    10         p.load(fis);
    11         //由key获得value
    12         String methodName=p.getProperty(s);
    13 //        System.out.println(methodName);
    14         
    15         Class clazz=Class.forName(methodName);
    16         //实例化接口
    17         Servlet servlet =(Servlet) clazz.newInstance();
    18         servlet.services();
    19     }
    20 
    21 }

    Servlet接口:

    1 public interface Servlet {
    2     String services();
    3 
    4 }

    模拟实现类首页资源:

    1 public class IndexServlet implements Servlet{
    2 
    3     @Override
    4     public String services() {
    5         System.out.println("这是首页资源");
    6         return null;
    7     }
    8 
    9 }

    模拟实现类登录资源:

    1 public class LoginServlet implements Servlet{
    2 
    3     @Override
    4     public String services() {
    5         System.out.println("这是登录页资源");
    6         return null;
    7     }
    8 
    9 }

    配置文件tomcat.properties:

    1 /index=com.blb.tomcat.p2.IndexServlet
    2 /login=com.blb.tomcat.p2.LoginServlet
  • 相关阅读:
    4、现有的命名方式有多少种?请举例说明。
    第二次作业
    第一次作业
    RateLimiter源码
    使用ASM字节码框架实现动态代理
    Java流机制学习
    Java8 Stream 学习总结
    XML实体解析器的作用
    DefaultResouceLoader的设计
    RSA 非对称加密 数字签名 数字证书
  • 原文地址:https://www.cnblogs.com/sunzhiqiang/p/11782808.html
Copyright © 2020-2023  润新知