写出获取对象名的三种方法:
方法一
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