博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA学习--反射基本知识
阅读量:6449 次
发布时间:2019-06-23

本文共 6659 字,大约阅读时间需要 22 分钟。

 

     * java.lang.Class:是反射的源头。
     * 我们创建了一个类,通过编译(javac.exe),生成对应的.class文件。之后我们使用java.exe加载(JVM的类加载器完成的)
     * 此.class文件,此.class文件加载到内存以后,就是一个运行时类,存在在缓存区。那么这个运行时类本身就是一个Class的实例!
     * 1.每一个运行时类只加载一次!
     * 2.有了Class的实例以后,我们才可以进行如下的操作:
     *     1)*创建对应的运行时类的对象
     *     2)获取对应的运行时类的完整结构(属性、方法、构造器、内部类、父类、所在的包、异常、注解、...)
     *     3)*调用对应的运行时类的指定的结构(属性、方法、构造器)
     *     4)反射的应用:动态代理

1     //在有反射以前,如何创建一个类的对象,并调用其中的方法、属性 2     @Test 3     public void test1(){ 4         Person p = new Person(); 5 //        Person p1 = new Person(); 6         p.setAge(10); 7         p.setName("TangWei"); 8         System.out.println(p); 9         p.show();10 //        p.display("HK");11     }
1     //有了反射,可以通过反射创建一个类的对象,并调用其中的结构 2     @Test 3     public void test2() throws Exception{ 4         Class clazz = Person.class; 5          6 //        Class clazz1 = String.class; 7          8         //1.创建clazz对应的运行时类Person类的对象 9         Person p = (Person)clazz.newInstance();10         System.out.println(p);11         //2.通过反射调用运行时类的指定的属性12         //2.113         Field f1 = clazz.getField("name");14         f1.set(p,"LiuDeHua");15         System.out.println(p);16         //2.217         Field f2 = clazz.getDeclaredField("age");18         f2.setAccessible(true);19         f2.set(p, 20);20         System.out.println(p);21         22         //3.通过反射调用运行时类的指定的方法23         Method m1 = clazz.getMethod("show");24         m1.invoke(p);25         26         Method m2 = clazz.getMethod("display",String.class);27         m2.invoke(p,"CHN");28         29     }

 

1     @Test2     public void test3(){3         Person p = new Person();4         Class clazz = p.getClass();//通过运行时类的对象,调用其getClass(),返回其运行时类。5         System.out.println(clazz);6     }
1     //如何获取Class的实例(3种) 2     @Test 3     public void test4() throws ClassNotFoundException{ 4         //1.调用运行时类本身的.class属性 5         Class clazz1 = Person.class; 6         System.out.println(clazz1.getName()); 7          8         Class clazz2 = String.class; 9         System.out.println(clazz2.getName());10         11         //2.通过运行时类的对象获取12         Person p = new Person();13         Class clazz3 = p.getClass();14         System.out.println(clazz3.getName());15         16         //3.通过Class的静态方法获取.通过此方式,体会一下,反射的动态性。17         String className = "com.atguigu.java.Person";18         19         20         Class clazz4 = Class.forName(className);21 //        clazz4.newInstance();22         System.out.println(clazz4.getName());23         24         //4.(了解)通过类的加载器25         ClassLoader classLoader = this.getClass().getClassLoader();26         Class clazz5 = classLoader.loadClass(className);27         System.out.println(clazz5.getName());28         29         System.out.println(clazz1 == clazz3);//true30         System.out.println(clazz1 == clazz4);//true31         System.out.println(clazz1 == clazz5);//true32     }
1     //关于类的加载器:ClassLoader 2     @Test 3     public void test5() throws Exception{ 4         ClassLoader loader1 = ClassLoader.getSystemClassLoader(); 5         System.out.println(loader1); 6          7         ClassLoader loader2 = loader1.getParent(); 8         System.out.println(loader2); 9         10         ClassLoader loader3 = loader2.getParent();11         System.out.println(loader3);12         13         Class clazz1 = Person.class;14         ClassLoader loader4 = clazz1.getClassLoader();15         System.out.println(loader4);16         17         String className = "java.lang.String";18         Class clazz2 = Class.forName(className);19         ClassLoader loader5 = clazz2.getClassLoader();20         System.out.println(loader5);21         22         //掌握如下23         //法一:24         ClassLoader loader = this.getClass().getClassLoader();25         InputStream is = loader.getResourceAsStream("com\\atguigu\\java\\jdbc.properties");26         //法二:27 //        FileInputStream is = new FileInputStream(new File("jdbc1.properties"));28         29         Properties pros = new Properties();30         pros.load(is);31         String name = pros.getProperty("user");32         System.out.println(name);33         34         String password = pros.getProperty("password");35         System.out.println(password);36         37     }
1 class Person extends Creature
implements Comparable,MyInterface{ 2 public String name; 3 private int age; 4 int id; 5 //创建类时,尽量保留一个空参的构造器。 6 public Person() { 7 super(); 8 // System.out.println("今天天气很闷热"); 9 }10 public Person(String name) {11 super();12 this.name = name;13 }14 private Person(String name, int age) {15 super();16 this.name = name;17 this.age = age;18 }19 public String getName() {20 return name;21 }22 public void setName(String name) {23 this.name = name;24 }25 public int getAge() {26 return age;27 }28 public void setAge(int age) {29 this.age = age;30 }31 32 public int getId() {33 return id;34 }35 public void setId(int id) {36 this.id = id;37 }38 @MyAnnotation(value = "abc123")39 public void show(){40 System.out.println("我是一个人!");41 }42 43 private Integer display(String nation,Integer i) throws Exception{44 System.out.println("我的国籍是:" + nation);45 return i;46 }47 @Override48 public String toString() {49 return "Person [name=" + name + ", age=" + age + "]";50 }51 @Override52 public int compareTo(Object o) {53 // TODO Auto-generated method stub54 return 0;55 }56 57 public static void info(){58 System.out.println("中国人!");59 }60 61 class Bird{62 63 }64 65 }

 

1 import static java.lang.annotation.ElementType.CONSTRUCTOR; 2 import static java.lang.annotation.ElementType.FIELD; 3 import static java.lang.annotation.ElementType.LOCAL_VARIABLE; 4 import static java.lang.annotation.ElementType.METHOD; 5 import static java.lang.annotation.ElementType.PARAMETER; 6 import static java.lang.annotation.ElementType.TYPE; 7  8 import java.lang.annotation.Retention; 9 import java.lang.annotation.RetentionPolicy;10 import java.lang.annotation.Target;11 12 @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})13 @Retention(RetentionPolicy.RUNTIME)14 public @interface MyAnnotation {15     String value();16 }
1 public class Creature
{2 public double weight;3 4 public void breath(){5 System.out.println("呼吸!");6 }7 }

 1 import java.io.Serializable; 2 3 public interface MyInterface extends Serializable{ 4 5 } 

转载于:https://www.cnblogs.com/zhangfan94/p/4273217.html

你可能感兴趣的文章
java aqs面试题_Java 并发面试题:说下你对 AQS 的理解?
查看>>
java定义两个动物抽象类 程序_java抽象类和接口详解
查看>>
mysql中builder_Laravel - MySQL数据库的使用详解2(Query Builder用法1:查询操作)
查看>>
java 值传递_Java只有值传递
查看>>
java wcf_Java调用wcf
查看>>
java集合表_Java集合—List列表
查看>>
java存钱_用Java编写一个简单的存款
查看>>
grub ubuntu关闭gnu_VMWare启动Ubuntu GNU grub 怎么进入界面系统
查看>>
java创建界面四句代码_Java并发的四句箴言
查看>>
java中面向字符的数据流_Java知多少(68)面向字符的输出流
查看>>
java的浅克隆_java浅克隆与深克隆
查看>>
java递归深度限制_为什么我可以达到不确定的最大递归深度?
查看>>
java更新停止程序_不停止JVM动态更新Java类
查看>>
java怎么创建属性类_怎么建立java类属性
查看>>
怎么让access数据库连接到Java_如何将Java连接到MS Access数据库
查看>>
java企业级应用开发设计总结_JavaEE(企业级应用开发)学习路线及知识总结
查看>>
java8u162环境_java - 日志文件未使用log4j 1.2.17和java8u162进行翻转 - 堆栈内存溢出...
查看>>
java如何导入扫描类_java – 导入扫描程序类的问题
查看>>
java迷你图书管理_JAVA高级特性——迷你图书管理系统(DOM4J操作存储集合中的对象)...
查看>>
java实现pdf旋转_基于Java实现PDF文本旋转倾斜
查看>>