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
原文地址:https://www.cnblogs.com/sunzhiqiang/p/11782808.html