初识Java反射机制

简介: 1.ClassLoader的类加载机制:并非一次性加载,而是需要的时候加载(运行期间动态加载)(Class文件加载到内存的代码段),static语句块在加载后执行一次。dynamic语句块(就是一个语句块,用大括号括起来)每次new新的对象都会执行,等同于构造方法中的语句,只不过加载到构造方法之前,用的较少。

1.ClassLoader的类加载机制:并非一次性加载,而是需要的时候加载(运行期间动态加载)(Class文件加载到内存的代码段),static语句块在加载后执行一次。dynamic语句块(就是一个语句块,用大括号括起来)每次new新的对象都会执行,等同于构造方法中的语句,只不过加载到构造方法之前,用的较少。

注意参数的大小写,也不要多加空格。

看下面这个例子:

 1 public class Dynamic {
 2 
 3     public static void main(String[] args) {
 4         new A();//不是一次性加载,从结果看出这个分割线的位置
 5         System.out.println("___________________");
 6         new B();
 7         
 8         new C();
 9         new C();
10         
11         new D();
12         new D();
13     }
14 
15 }
16 
17 class A {
18     
19 }
20 
21 class B {
22     
23 }
24 
25 class C {
26     static {
27         System.out.println("——————————————静态类加载——————————————");
28     }
29 }
30 
31 class D {
32     {
33         System.out.println("************动态类加载***********");
34     }
35 }

下面是未加-verbose:class的结果:

___________________
——————————————静态类加载——————————————
************动态类加载***********
************动态类加载***********

 

下面是加参数后的结果:

2.verbose:冗长的详细的

3.JDK里的类加载器很多。
4.bootstrap:启动节点,引导节点。

 1 public class TestJDKClassLoader {
 2 
 3     public static void main(String[] args) {
 4         System.out.println(String.class.getClassLoader());
 5         //System.out.println(com.sum.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());
 6         System.out.println(TestJDKClassLoader.class.getClassLoader());
 7         System.out.println(ClassLoader.getSystemClassLoader());
 8     }
 9 
10 }
null
sun.misc.Launcher$AppClassLoader@45a1472d
sun.misc.Launcher$AppClassLoader@45a1472d

 

5.ClassLoader类在java.lang包里

 1 public class TestJDKClassLoader {
 2 
 3     //getClass可以获取一个类的定义信息,然后使用反射去访问其全部信息(包括函数和字段)
 4     public static void main(String[] args) {
 5         ClassLoader c = TestJDKClassLoader.class.getClassLoader();
 6         while(null!=c) {
 7             System.out.println(c.getClass().getName());
 8             //虽然叫parent但并不是继承
 9             c = c.getParent();
10         }
11     }
12 
13 }
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader

 

6.对象.getClass相当于类名.class。

7.properties文件

   参考资料:http://blog.csdn.net/netwarning/article/details/1569900

  properties文件顾名思义就是属性文件,可以在它里面定义一些字段,这将不需要我们在代码中书写,这些信息从代码中分离出来了。看下面的例子:

  注意在文件里面就不需要加分号。

 1 //文件名为myProperties.properties
 2 
 3 String driver = "com.mysql.jdbc.Driver"
 4 String url = "jdbc:mysql://localhost/myDB";
 5 String name = "root"
 6 String password = "123"
 7 
 8 //***************************
 9 Class.forName(driver);
10 Connection con = DriverManager.getConnection(url,name,password);
11 
12 //**************************
13 String driver; 
14 String url;
15 String name; 
16 String password; 
17 
18 FileInputStream fis = new FileInputStream(myProperties.properties);
19 Properties properties = new Properties();
20 properties.load(fis);            //从输入流中读取属性文件的内容
21 fis.close();
22 //从属性文件中读取相应字段的信息
23 driver = properties.getProperty(driver);
24 url = properties.getProperty(url);
25 name = properties.getProperty(name);
26 password = properties.getProperty(password);
27 
28 Class.forName(driver);
29 Connection con = DriverManager.getConnection(url,name,password);
30 
31 /*
32 我们看到数值和代码已经分离,这样很方便我们修改数值!
33 再有一定要注意properties文件中的字段的写法,不要再多添“”否则会出现问题!
34 因为getProperty()方法返回的是一个字符串!
35 
36 我想应该再对这个文件做一下加密处理会更好一些是吧? 
37 */

  8.Java语言不够动态,真正动态的语言是JS、Ruby和Python。
  9.java的反射机制很重要,是学习SSH的基础以及面向切面编程Aspect Oriented Programming(AOP)。
  10.RC就是Release Candidate(候选版本)的简称。从微软的惯例来看OS的开发步骤是这样的:内部测试->alpha公测->beta公测->RC版->正式版上市。
  11.下面是反射机制的例子:

 1 package a;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 /*
 6  * properties文件里只有class=T,注意没有问号
 7  * 实现了代码和数据的分离,这样不必写死
 8  * 问题:知道类名字,然后new出来一个
 9  */
10 
11 //学习SSH时类的名字很多时候都是在配置文件里的
12 public class TestReflection {
13 
14     public static void main(String[] args) throws Exception {
15         /*
16          * 使用new创建一个类的时候,这个类可以没有被加载。
17          * 但是使用newInstance()方法的时候,
18          * 就必须保证这个类已加载且类已经连接了。
19          */
20         String str = "a.T";//到时候这个换成从文件里读取,靠,必须写完整路径
21     
22         Class c = Class.forName(str);//加载类
23         /*
24          * newInstance和new的区别在于一个方法一个关键字
25          * 且前者要求类已经加载了才可实例化
26          */
27         Object obj = c.newInstance();
28         Method[] methods = c.getMethods();
29         for(Method m: methods) {
30             //System.out.println(m.getName());
31             if(m.getName().equals("myMehtod")) {
32                 //不能是c或者T.class,因为方法
33                 /*
34                  * invoke方法是可变参数的方法,传递0个或者多个参数
35                  * 主要是因为不知道传递几个参数
36                  */
37                 m.invoke(obj,2);//必须是obj,不能是c,方法的调用是对象
38                 for(Class paramType : m.getParameterTypes()) {
39                     System.out.println(paramType.getName());
40                 }
41             }
42             
43             if(m.getName().equals("getS")) {
44                 Class returnType = m.getReturnType();
45                 System.out.println(returnType.getName());
46             }
47         }
48         
49     }
50 
51 }
52 
53 class T {
54     //static块的用法http://www.cnblogs.com/hxsyl/archive/2013/04/16/3024953.html
55     static {//类加载时执行
56         System.out.println("T loaded");//就是为了证明类已经加载
57     }
58     
59     public T() {
60         System.out.println("T constructed");
61     }
62     
63     int i;
64     String s;
65     
66     public void myMehtod(int i) {
67         this.i = i;
68         System.out.println("方法调用");
69     }
70     
71     public String getS() {
72         return s;
73     }
74 }

   12.理解invoke方法

 1 package a;
 2 
 3 /*
 4  * 下面这个是网上的代码,找了好久还就这一个
 5  * 看了也还是没明白invoke方法
 6  */
 7 import java.lang.reflect.Method;
 8 
 9 public class InvokeTester {
10 
11     public int add(int param1, int param2) {
12         return param1 + param2;
13     }
14 
15     public String echo(String msg) {
16         return "echo:" + msg;
17     }
18 
19     public static void main(String[] args) throws Exception {
20         Class classType = InvokeTester.class;
21         Object invokertester = classType.newInstance();
22 
23         Method addMethod = classType.getMethod("add", new Class[] { int.class,
24                 int.class });
25         // Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,
26         // 如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,
27         // 如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,
28         // 再将其返回
29         Object result = addMethod.invoke(invokertester, new Object[] {
30                 new Integer(100), new Integer(200) });
31         // 在jdk5.0中有了装箱 拆箱机制 new Integer(100)可以用100来代替,系统会自动在int 和integer之间转换
32         System.out.println(result);
33 
34         Method echoMethod = classType.getMethod("echo",
35                 new Class[] { String.class });
36         result = echoMethod.invoke(invokertester, new Object[] { "hello" });
37         System.out.println(result);
38     }
39 }

  13.java的反射机制会破坏单例模式……

 

目录
相关文章
|
5月前
|
设计模式 人工智能 安全
AQS:Java 中悲观锁的底层实现机制
AQS(AbstractQueuedSynchronizer)是Java并发包中实现同步组件的基础工具,支持锁(如ReentrantLock、ReadWriteLock)和线程同步工具类(如CountDownLatch、Semaphore)等。Doug Lea设计AQS旨在抽象基础同步操作,简化同步组件构建。 使用AQS需实现`tryAcquire(int arg)`和`tryRelease(int arg)`方法以获取和释放资源,共享模式还需实现`tryAcquireShared(int arg)`和`tryReleaseShared(int arg)`。
252 32
AQS:Java 中悲观锁的底层实现机制
|
3月前
|
人工智能 缓存 安全
Java中的反射机制:深入探索与应用
Java反射机制是程序运行时动态获取类信息并操作类成员的特性,具备高度灵活性,但也伴随性能与安全风险。本文详解反射的基本用法、高级应用及最佳实践,助你掌握这一强大工具的正确使用方式。
136 0
|
5月前
|
人工智能 Java 关系型数据库
Java——SPI机制详解
SPI(Service Provider Interface)是JDK内置的服务提供发现机制,主要用于框架扩展和组件替换。通过在`META-INF/services/`目录下定义接口实现类文件,Java程序可利用`ServiceLoader`动态加载服务实现。SPI核心思想是解耦,允许不同厂商为同一接口提供多种实现,如`java.sql.Driver`的MySQL与PostgreSQL实现。然而,SPI存在缺陷:需遍历所有实现并实例化,可能造成资源浪费;获取实现类方式不够灵活;多线程使用时存在安全问题。尽管如此,SPI仍是Java生态系统中实现插件化和模块化设计的重要工具。
159 0
|
3月前
|
人工智能 前端开发 安全
Java开发不可不知的秘密:类加载器实现机制
类加载器是Java中负责动态加载类到JVM的组件,理解其工作原理对开发复杂应用至关重要。本文详解类加载过程、双亲委派模型及常见类加载器,并介绍自定义类加载器的实现与应用场景。
186 4
|
3月前
|
人工智能 安全 Java
掌握Java反射:在项目中高效应用反射机制
Java反射是一种强大功能,允许程序在运行时动态获取类信息、创建对象、调用方法和访问字段,提升程序灵活性。它在框架开发、动态代理、注解处理等场景中广泛应用,如Spring和Hibernate。但反射也存在性能开销、安全风险和代码复杂性,应谨慎使用。
|
4月前
|
人工智能 Java
Java中的反射机制:深入探索与应用
本文介绍了Java反射机制的基本概念、用途及其实现方式。反射机制允许程序在运行时动态获取类的属性和方法,并调用它们,适用于处理私有成员或权限受限的情况。文章详细讲解了`Class`类的功能,包括获取类的方法、属性、注解、构造器等信息,以及通过四种方式获取`Class`对象的示例代码。此外,还探讨了类加载器、继承关系判断、动态代理等高级内容,展示了如何在运行时创建接口实例并处理方法调用。文末提供了完整的代码示例以加深理解。
Java中的反射机制:深入探索与应用
|
5月前
|
Java 区块链 网络架构
酷阿鲸森林农场:Java 区块链系统中的 P2P 区块同步与节点自动加入机制
本文介绍了基于 Java 的去中心化区块链电商系统设计与实现,重点探讨了 P2P 网络在酷阿鲸森林农场项目中的应用。通过节点自动发现、区块广播同步及链校验功能,系统实现了无需中心服务器的点对点网络架构。文章详细解析了核心代码逻辑,包括 P2P 服务端监听、客户端广播新区块及节点列表自动获取等环节,并提出了消息签名验证、WebSocket 替代 Socket 等优化方向。该系统不仅适用于农业电商,还可扩展至教育、物流等领域,构建可信数据链条。
|
5月前
|
人工智能 JavaScript Java
Java反射机制及原理
本文介绍了Java反射机制的基本概念、使用方法及其原理。反射在实际项目中比代理更常用,掌握它可以提升编程能力并理解框架设计原理。文章详细讲解了获取Class对象的四种方式:对象.getClass()、类.class、Class.forName()和类加载器.loadClass(),并分析了Class.forName()与ClassLoader的区别。此外,还探讨了通过Class对象进行实例化、获取方法和字段等操作的具体实现。最后从JVM类加载机制角度解析了Class对象的本质及其与类和实例的关系,帮助读者深入理解Java反射的工作原理。
104 0
|
7月前
|
缓存 Dubbo Java
理解的Java中SPI机制
本文深入解析了JDK提供的Java SPI(Service Provider Interface)机制,这是一种基于接口编程、策略模式与配置文件组合实现的动态加载机制,核心在于解耦。文章通过具体示例介绍了SPI的使用方法,包括定义接口、创建配置文件及加载实现类的过程,并分析了其原理与优缺点。SPI适用于框架扩展或替换场景,如JDBC驱动加载、SLF4J日志实现等,但存在加载效率低和线程安全问题。
279 7
理解的Java中SPI机制
|
6月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
474 1