`
7wolfs
  • 浏览: 182626 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java 学习笔记:1,类引导,反射机制下的对象创建

    博客分类:
  • Java
阅读更多
1, 类引导,反射机制下的对象创建
类引导最终会字节流传给native 的java.lang.ClassLoader.defineClass1方法。
Class的 newInstance 方法 创建对象实例的时候,会调用无参的构造函数,如果类中没有 无参数的构造函数,JVM 会抛出java.lang.InstantiationException异常,无法进行实例化。
针对有参数的构造函数的类,可以调用class的getDeclaredMethod和Constructor 来构造这一个class的对象。

如果无参的构造函数是private类型,JVM调用该类时,会报private权限的错误。将无参的构造函数设为public类型可以解决该问题。

URL url1 = new URL("file:/E:/Server/vsmessages_fortest.jar");
			URLClassLoader myClassLoader = new URLClassLoader( new  URL[]   { url1 } );
			Class myClass  =  myClassLoader.loadClass("cn.com.*.messageagent.vo.MessageVO");
			Method m01 = myClass.getDeclaredMethod("setClientId", String.class);
			Method m02 = myClass.getDeclaredMethod("getClientId");
			
			
			Constructor ctor = myClass.getConstructor(String.class);
			
		    ctor.setAccessible(true);
		    Object targetObj1 = ctor.newInstance("1234567");
			
//			m01.invoke(targetObj1, "123456");
			String clientId = (String) m02.invoke(targetObj1);
			log.info("clientId:" + clientId);



备注:
Java in a Nutshell这本书的第12章介绍了与class的反射机制有关的基本方法。
Example 12.1: Obtaining Class and Member Information with the Reflection API

import java.lang.reflect.*;
/** A program that displays a class synopsis for the named class. */
public class ShowClass {
  /** The main method.  Print info about the named class. */
  public static void main(String[] args) throws ClassNotFoundException {
    Class c = Class.forName(args[0]);
    print_class(c);
  }
  /** Display the modifiers, name, superclass, and interfaces of a class
   *  or interface. Then go and list all constructors, fields, and methods. */
  public static void print_class(Class c)
  {
    // Print modifiers, type (class or interface), name, and superclass.
    if (c.isInterface()) {
      // The modifiers will include the "interface" keyword here...
      System.out.print(Modifier.toString(c.getModifiers()) +  c.getName());
    }
    else
      System.out.print(Modifier.toString(c.getModifiers()) + " class " +
                       c.getName() +
                       " extends " + c.getSuperclass().getName());
    // Print interfaces or super-interfaces of the class or interface.
    Class[] interfaces = c.getInterfaces();
    if ((interfaces != null) && (interfaces.length > 0)) {
      if (c.isInterface()) System.out.println(" extends ");
      else System.out.print(" implements ");
      for(int i = 0; i < interfaces.length; i++) {
        if (i > 0) System.out.print(", ");
        System.out.print(interfaces[i].getName());
      }
    }
    System.out.println(" {");            // Begin class member listing.
    // Now look up and display the members of the class.
    System.out.println(" // Constructors");
    Constructor[] constructors = c.getDeclaredConstructors();
    for(int i = 0; i < constructors.length; i++)      // Display constructors.
      print_method_or_constructor(constructors[i]);
    System.out.println(" // Fields");
    Field[] fields = c.getDeclaredFields();           // Look up fields.
    for(int i = 0; i < fields.length; i++)            // Display them.
      print_field(fields[i]);
    System.out.println(" // Methods");
    Method[] methods = c.getDeclaredMethods();        // Look up methods.
    for(int i = 0; i < methods.length; i++)           // Display them.
      print_method_or_constructor(methods[i]);
    System.out.println("}");             // End class member listing.
  }
  /** Return the name of an interface or primitive type, handling arrays. */
  public static String typename(Class t) {
    String brackets = "";
    while(t.isArray()) {
      brackets += "[]";
      t = t.getComponentType();
    }
    return t.getName() + brackets;
  }
  /** Return a string version of modifiers, handling spaces nicely. */
  public static String modifiers(int m) {
    if (m == 0) return "";
    else return Modifier.toString(m) + " ";
  }
  /** Print the modifiers, type, and name of a field. */
  public static void print_field(Field f) {
    System.out.println("  " +
                       modifiers(f.getModifiers()) +
                       typename(f.getType()) + " " + f.getName() + ";");
  }
  /** Print the modifiers, return type, name, parameter types, and exception
   *  type of a method or constructor.  Note the use of the Member interface
   *  to allow this method to work with both Method and Constructor objects. */
  public static void print_method_or_constructor(Member member) {
    Class returntype=null, parameters[], exceptions[];
    if (member instanceof Method) {
      Method m = (Method) member;
      returntype = m.getReturnType();
      parameters = m.getParameterTypes();
      exceptions = m.getExceptionTypes();
    } else {
      Constructor c = (Constructor) member;
      parameters = c.getParameterTypes();
      exceptions = c.getExceptionTypes();
    }
    System.out.print("  " + modifiers(member.getModifiers()) +
                     ((returntype!=null)? typename(returntype)+" " : "") +
                     member.getName() + "(");
    for(int i = 0; i < parameters.length; i++) {
      if (i > 0) System.out.print(", ");
      System.out.print(typename(parameters[i]));
    }
    System.out.print(")");
    if (exceptions.length > 0) System.out.print(" throws ");
    for(int i = 0; i < exceptions.length; i++) {
      if (i > 0) System.out.print(", ");
      System.out.print(typename(exceptions[i]));
    }
    System.out.println(";");
  }
}
分享到:
评论

相关推荐

    [Java学习笔记doc]之反射机制

    - Java的反射机制还支持动态代理,通过`java.lang.reflect.Proxy`类和`InvocationHandler`接口,可以在运行时创建一个新的类来实现已有的接口。 6. 注解处理: - 反射还可以用于处理注解(Annotation),通过`...

    java学习笔记

    在基础语法部分,Java学习笔记详细讲解了变量、数据类型、运算符、流程控制语句(如if-else、for、while等)、数组以及面向对象编程的基本概念,如类、对象、封装、继承和多态。这些内容是任何Java程序员必备的基础...

    java学习笔记文档

    4. **反射机制**:介绍如何在运行时动态获取类信息、创建对象、调用方法,以及代理模式的应用。 5. **文件和文件系统操作**:包括文件的读写、目录管理、文件过滤器和文件观察者。 6. **枚举和注解**:解释枚举...

    Java语言程序设计学习笔记

    24. **反射机制**:在运行时动态获取类信息,创建对象,调用方法。 25. **Java集合框架高级话题**:如并发容器(ConcurrentHashMap、CopyOnWriteArrayList等),Lambda表达式,Stream API。 26. **设计模式**:...

    [Java学习笔记doc](必看经典)

    10. **反射机制**:通过反射可以动态地获取类的信息并操作类的对象,这是Java强大的动态性体现。 11. **JavaSE、JavaEE和JavaME**:这三者分别对应Java的标准版、企业版和微型版,各有不同的应用场景。 12. **JVM...

    狂神说Java笔记资料

    《狂神说Java笔记资料》是一份全面涵盖Java开发基础知识的文档集,旨在帮助学习者系统地掌握Java编程。这份笔记包含多个章节,每个章节都深入讲解了一个特定的主题,覆盖了从初学者到进阶开发者必备的知识点。 1. *...

    [Java学习笔记doc]-javase基本知识

    **Java学习笔记——Java SE基本知识** Java是一种广泛使用的面向对象的编程语言,以其跨平台、安全性高和可移植性而闻名。Java Standard Edition(Java SE)是Java平台的基础,它提供了开发和运行桌面应用程序、...

    任小龙java全部笔记

    9. **反射机制**:Java反射API允许在运行时检查类、接口、构造器和方法的信息,甚至可以动态地创建对象并调用方法。 10. **Java Swing和JavaFX**:这两是Java的图形用户界面(GUI)库,用于创建桌面应用程序。笔记...

    狂神说笔记内容.zip

    15. **反射机制**:通过反射动态获取类的信息,创建对象,调用方法。 以上内容只是基础部分,完整的"狂神说Java入门笔记"可能还涉及更高级的主题,如网络编程、数据库连接、Swing或JavaFX图形界面开发、XML处理等。...

    java基础笔记总结

    这份"java基础笔记总结"将引导我们深入了解这个强大的面向对象的语言。以下是对这些基础知识的详细解释: 1. **Java简介**:Java是由Sun Microsystems(现为Oracle Corporation)开发的一种高级、跨平台的编程语言...

    java基础知识笔记 java基础知识笔记

    13. **反射机制**:在运行时动态获取类的信息并操作类的方法和属性。 14. **垃圾回收机制**:Java自动管理内存,垃圾回收器会自动回收不再使用的对象所占用的内存。 15. **泛型**:提供类型安全,允许在编译时检查...

    java课程笔记(pdf版).zip

    8. **反射**:Java反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件系统、序列化、动态代理等高级功能十分有用。 9. **泛型**:泛型引入了类型参数,增强了代码的安全性和可读性。学习如何使用...

    java核心笔记 这是很基础的笔记 我自己整理的

    笔记共分为17天的学习内容,这意味着它将逐步引导你深入理解Java的核心概念。 第1天:Java简介与环境配置 在第一天,你会了解到Java的历史、特点以及为什么它如此受欢迎。你将学习如何在不同的操作系统(如Windows...

    韩顺平java从入门到精通笔记完整版

    总之,《韩顺平Java从入门到精通笔记完整版》是Java学习者的一份宝贵资料,它覆盖了Java编程的各个方面,从基础到进阶,从理论到实践,旨在帮助你全面理解和掌握这门强大的编程语言。无论你是刚接触编程的新手,还是...

    java从入门到精通全过程笔记.rar

    这份“java从入门到精通全过程笔记”将引导你逐步掌握Java的核心概念和技术,从而成为熟练的Java开发者。以下是对这份笔记内容的详细概述: 1. **Java简介**:首先,笔记会介绍Java的历史、特点以及其在软件开发中...

    良葛格 Java 學習筆記-V2.zip

    【Java学习笔记-V2】是良葛格精心整理的一份Java学习资源,旨在帮助初学者和进阶者深入理解Java编程语言。这份笔记涵盖了Java的基础概念、语法特性、面向对象编程、异常处理、多线程、集合框架、IO流、网络编程、...

    良葛格Java JDK 5.0学习笔记

    良葛格的Java JDK 5.0学习笔记是一份宝贵的资源,旨在帮助初学者和有经验的开发者深入理解这一版本的新特性和改进。 一、自动类型转换与类型推断(Generics) JDK 5.0引入了泛型,允许在类、接口和方法声明中使用...

    java基础笔记

    Java基础笔记涵盖了Java编程语言的核心概念,是学习Java SE(标准版)的入门资料。这份笔记以Markdown(MD)格式编写,提供了清晰易读的文本结构,适合使用Markdown阅读器或者支持MD格式的编辑器来查看。以下是笔记...

    java虚拟机笔记及代码.zip

    9. **反射**:Java反射API允许程序在运行时动态访问类的信息,创建和操作类的对象,增强了程序的灵活性。 10. **模块系统**:从Java 9开始,JVM引入了模块系统(Project Jigsaw),提高了代码的封装性和可维护性。 ...

Global site tag (gtag.js) - Google Analytics