精华内容
下载资源
问答
  • Java Class类简介

    万次阅读 2011-01-22 17:48:00
    class类的实例表示java应用运行时的类(class ans enum)或接口(interface and annotation)(每个java类运行时都在JVM里表现为一个class对象,可通过类名.class,类型.getClass(),Class.forName("类名")等方法...

    一,Class类有什么用?

       Class类的实例表示java应用运行时的类(class and enum)或接口(interface and annotation)(每个java类运行时都在JVM里表现为一个class对象,可通过类名.class, 类型.getClass(), Class.forName("类名")等方法获取class对象)。数组同样也被映射为为class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本类型boolean,byte,char,short,int,long,float,double和关键字void同样表现为 class  对象。

     

    二,Class类的特征
        Class类没有公有的构造方法,它由JVM自动调用(在new对象或者加载-classLoader时)。

        下面的方法作用是打印出对象的class name:

     void printClassName(Object obj) {
             System.out.println("The class of " + obj +
                                " is " + obj.getClass().getName());
       }
      同样可以根据class literal 获得class name:
      System.out.println("The name of class Foo is: "+Foo.class.getName());//你可以将Foo改为void尝试下。
    三,Class的主要方法

    Class类的方法还是挺多的。主要是用于得到运行时类的相关信息(可用于反射)。

      重要的几个方法:

    1, public static Class<?> forName(String className) :native 方法,动态加载类。非常重要。
           如在sql中动态加载驱动程序:class.forName(sqlDriver);

    2,public T newInstance() :根据对象的class新建一个对象,用于反射。非常重要。
           可用在反射中构建对象,调用对象方法:

           class doubleClass= class.forName("java.lang.Double");

           Object objDouble = doubleClass.newInstance();

           如在javaBean中就应用了这个方法,因为java默认要有一个无参构造函数。

    3, public ClassLoader getClassLoader() :获得类的类加载器Bootstrap  ,Extension ,System or user custom      ClassLoader(一般为system classloader)。重要。

     

    4,public String getName() :获取类或接口的名字。记住enum为类,annotation为接口。重要

    5,public native Class getSuperclass():获取类的父类,继承了父类则返回父类,否则返回java.lang.Object。返回Object的父类为空-null。一般
    6,public java.net.URL getResource(String name) :根据字符串获得资源。

    7,其他类 

     public boolean isEnum() :判断是否为枚举类型。

     public native boolean isArray() :判断是否为数组类型。

     public native boolean isPrimitive() :判断是否为基本类型。
     public boolean isAnnotation() :判断是否为注解类型。


    public Package getPackage() :反射中获得package,如java.lang.Object 的package为java.lang。

    public native int getModifiers() : 反射中获得修饰符,如public static void等 。

    public Field getField(String name):反射中获得域成员。

    public Field[] getFields() :获得域数组成员。    
    public Method[] getMethods() :获得方法。

    public Method getDeclaredMethod(String name, Class<?>... parameterTypes):加个Declared代表本类,继承,父类均不包括。

    public Constructor<?>[] getConstructors() :获得所有的构造函数。

    如此我们可以知道反射可以运行时动态获得类的所有信息,并新建对象(newInstance()方法)。

    如我们定义一个类:

    public class Test{
    
       //Constructor
    
       public Test(){this("");}
    
       public Test(String name){}
    
       //Field
    
       public int id;
    
       public String name;
    
       //Method
    
       public void testMethod(){
    
    
    
       }
    
    }


    我们可以:

    Class c = Class.forName("Test");
    Method m[] = c.getDeclaredMethods();
    for (int i = 0; i < m.length; i++)
       System.out.println(m[i].toString());//输出testMethod
    }
    
    Constructor c[] = cls.getDeclaredConstructors();
    for (int i = 0; i < c.length; i++) {
       Constructor ct = c[i];
    System.out.println("name = " + ct.getName());//输出两个构造函数信息
    
    

    没时间写了,别人用电脑了。。。。

     

     

    展开全文
  • kotlin反射class.java和javaClass区别

    千次阅读 2017-12-28 19:51:27
    kotlin反射class.java和javaClass区别kotlin文件的类class Person { var name: String = "" var age: Int = 0 } java文件的类public class Cat {}测试代码:fun main(args: Array) { val person = Person() val

    kotlin反射class.java和javaClass区别

    kotlin文件的类

    class Person {
        var name: String = ""
        var age: Int = 0
    }
    

    java文件的类

    public class Cat {
    
    }
    
    

    测试代码:

    fun main(args: Array<String>) {
        val person = Person()
        val cat = Cat()
        println("person::class=${person::class}")//得到的是KClass<Person>和Person::class一样
        println("person::class.java=${person::class.java}")//得到的是Class<Person>对象
        println("person::javaClass=${person::javaClass}")//未知?
        println("person.javaClass.kotlin=${person.javaClass.kotlin}")//得到的是Class<Person>对象
        println("cat.javaClass.kotlin=${cat.javaClass.kotlin}")//拿到的是KClass
        println("Cat::class.java=${Cat::class.java}")//得到的Class<Cat>
        println("cat.javaClass == Cat::class.java=${cat.javaClass == Cat::class.java}")//Class<Cat>==Class<Cat>
        println("person.javaClass == Person::class.java=${person.javaClass == Person::class.java}")//Class<Person>==Class<Person>
        println("person.javaClass.kotlin == Person::class=${person.javaClass.kotlin == Person::class}")//KClass<Person>==KClass<Person>
        println("cat.javaClass.kotlin == Cat::class=${cat.javaClass.kotlin == Cat::class}")//KClass<Cat>==KClass<Cat>
    }
    

    输出结果:

    person::class=class Person (Kotlin reflection is not available)
    person::class.java=class Person
    person::javaClass=property javaClass (Kotlin reflection is not available)
    person.javaClass.kotlin=class Person (Kotlin reflection is not available)
    cat.javaClass.kotlin=class Cat (Kotlin reflection is not available)
    Cat::class.java=class Cat
    cat.javaClass == Cat::class.java=true
    person.javaClass == Person::class.java=true
    person.javaClass.kotlin == Person::class=true
    cat.javaClass.kotlin == Cat::class=true
    
    Process finished with exit code 0
    

    总结:
    Cat::class.java和cat.javaClass都表示Class
    person.javaClass.kotlin == Person::class都表示KClass

    展开全文
  • Kotlin的类 class Person { var name: String = "" var age: Int = 0 ...java类 public class Man { } 要知道获取的到底是什么,可以利用andorid stuido的类型提示,一目了然。 ...

    Kotlin的类

    class Person {
        var name: String = ""
        var age: Int = 0
        companion object {
    
        }
    }


    java类

    public class Man {
    }


    要知道获取的到底是什么,可以利用andorid stuido的类型提示,一目了然。
     

    这里写图片描述

    第二张:

    这里写图片描述


    引申

    在Java中使用Class很常见的就是,xxx类.class,比如我们在startActivity的时候startActivity(new Intent(this, OtherActivity.class)); 这里接收的就是CLass<?> cls参数。
    那么在java中获取Class的方法有哪些呢?

    1、Class c = person.getClass(); //对象获取
    2、Class cc =Person.class;//类获取
    

    而我们来看看kotlin

    //对象获取
    person.javaClass// javaClass
    person::class.java // javaClass
    //类获取
    Person::class// kClass
     person.javaClass.kotlin// kClass
    (Person::class as Any).javaClass// javaClass
    Person::class.java // javaClass
    

    哇,这么多种,他们是不是一样的,有没有什么区别?
    log看看他们到底是不是相同的Class

    println(person.javaClass == person::class.java) //true
    println(person.javaClass == Person::class.java)//true
    println(person::class.java == Person::class.java)//true
     //person.javaClass == person::class.java == Person::class.java
    println(person.javaClass == Person::class)//false
    println(person.javaClass.kotlin == Person::class)//true
    println(person::class == Person::class)//true
    

    从log来看,person.javaClass == person::class.java == Person::class.java
    三者是相同的。但是person.javaClass == Person::class却是不同的。为什么呢?

    原因是在kotlin中的Class与Java不同,kotlin中有一个自己的Class叫做KClassperson::class 和Person::class都是获取kotlin的KClass,所以println(person::class == Person::class) 为true。
    我们可以从kotlin的KClass获取到java的Class,person::class.java就是如此,先获取到kotlin的KClass然后再获取javaClass。
    object/class->kClass->Class
    同样也可以通过java的Class获取kotlin的KClass,person.javaClass.kotlin就是先获取javaClass然后再获取kotlin的KClass
    object/class->Class->KClass
    那么KClass都有些什么用呢?Find Usages 可以看到


    几乎多数跟Reflect相关,而用的最多的也是在KClasses里面
    KClasses扩展了许多跟反射相关的方法,算的上是kotlin的反射中类主力输出。



    如果要使用kotlin的反射类的话,要加入

      compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    

    举个例子

    我们要把一个类的所有字段通过反射给打印出来,调用java的方法来实现是这样

     println (Person::class.java.declaredFields.map {
                it.isAccessible = true
                "${it.name}: ${it.get(person)}"
            }.joinToString(","))
    

    我们通过Person::class拿到KClass,然后.java拿到java的Class<?>,再获取declaredFields,最后通过map,然后把获取的Field获取到值打印出来

    问题

    而使用kotlin,我们还有别的做法

     println (Person::class.memberProperties.map {
                it.isAccessible = true
                "${it.name}: ${it.get(person)}"
            }.joinToString(","))
    

    通过Person::class拿到KClass,直接调用KClass的memberProperties来拿到KProperty的Collection集合,然后进行操作。当然,这里KProperty也是kotlin的反射类中的,也类似于Java的Field。
    那么既然可以这样,理论上这样也应该是可以的

    //person是对象不是Person类
     println (person::class.memberProperties.map {
                it.isAccessible = true
                "${it.name}: ${it.get(person)}"
            }.joinToString(","))
    

    这下却出错了,真的奇怪!

    Error:(73, 31) Out-projected type 'KProperty1<out OtherActivity.Person, Any?>' prohibits the use of 'public abstract fun get(receiver: T): R defined in kotlin.reflect.KProperty1'
    

    为什么会这样?

    查看it发现

    kotlin的property的Person为out逆变的,R只能作为输出,不能作为get的参数传入,所报错了。
    这里的kotlin泛型还是有点小坑的需要你踩一踩,网上有一篇文章解释说明了一番

    那么怎么改呢?三种办法:

    第一种:

    //扩展KProperty的get方法为getUnsafed,其实就是去掉了out
       fun <T, R> KProperty1<T, R>.getUnsafed(receiver: Any): R {
            return get(receiver as T)
        }
    //然后
    println(person::class.memberProperties.map {
                it.isAccessible = true
                "${it.name}: ${it.getUnsafed(person)}"
            }.joinToString(","))
    

    第二种:

    //强转一下
     println(person::class.memberProperties.map {
                it.isAccessible = true
                it as KProperty1<Person, Any>
                "${it.name}: ${it.get(person)}"
            }.joinToString(","))
    

    第三种:

    //这一种就涉及到kotlin中的获取KClass的方式, 先获取java的Class再获取kotlin的KClass
    //神奇的是,这种获取到的it的类型没有out,而是我们期望的 KProperty1<Person, Any>
     println(person.javaClass.kotlin.memberProperties.map {
                it.isAccessible = true
                "${it.name}: ${it.get(person)}"
            }.joinToString(","))
    


    摘自:链接:https://www.jianshu.com/p/a900ee71ae7f
     

     

    展开全文
  • 现在创建出来的java class文件也是这样的![图片说明](https://img-ask.csdn.net/upload/201711/23/1511426283_259446.jpg) 跪求各位熟练运用intellij idea大神的帮助 现在创建出来的java class文件也是
  • 首先对JAVA 名称官方参数进行说明。...通过以上官方java jvm参数命令,可知有两种设置classpath方式,这两种方式分别针对java class名、java -jar 两种启动方式。 方式一:java -classpath class名 -cp &...

    java classpath设置方式启动详解:java className、java -jar

    前言

    首先对JAVA 名称官方参数进行说明。
    java --help 或者 java -?打印标准java命令
    这里写图片描述

    java -X 打印非标准选项(常用jvm 参数设置)

    这里写图片描述

    通过以上官方java jvm参数命令,可知有两种设置classpath方式,这两种方式分别针对java class名、java -jar 两种启动方式。

    方式一:java -classpath MainClassName

    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径> 用 ; 分隔的目录, JAR 档案 和 ZIP 档案列表, 用于搜索类文件。
    上面两个命令效果是一样的。
    一般通过 java -classpath “xxx.jar:xxx2.jar” com.test.TestMain
    com.test.TestMain为带main方法的主类。
    注意:请不要再java -jar中使用此命令,无效~,麻烦了解java -jar 启动机制,是默认读取java中Manifest文件配置main启动类和classpath等其他信息。

    比如spring boot 打包的项目文件如下:

    方式二:java -jar jar包名

    Java 命令行提供了如何扩展bootStrap 级别class的简单方法.
    -Xbootclasspath: 完全取代基本核心的Java class 搜索路径.
    不常用,否则要重新写所有Java 核心class
    -Xbootclasspath/a: 后缀在核心class搜索路径后面.常用
    -Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用,避免
    引起不必要的冲突.

    当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误。
    实际上这是由于当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本身yourJarExe.jar的内部class(在jar包内部的MainFest文件)作为类的寻找范围。

    语法如下:
    (分隔符与classpath参数类似,unix使用:号,windows使用;号,这里以unix为例)

    java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar

    jar -jar启动设置方式

    1、extend class 扩展方案

    Java exten class 存放在{Java_home}\jre\lib\ext目录下.当调用Java时,对扩展class路径的搜索是自动的.总会搜索的.这样,解决的方案就很简单了,将所有要使用的第三方的jar包都复制到ext 目录下.

    2、User class扩展方案

    当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设置为codebase目录,所有的class搜索都在这个目录下开始.所以如果使用了其他第三方的jar包,一个比较可以接受的可配置方案,就是利用jar包的Manifest扩展机制.
    步骤如下:
    1、将需要的第三方的jar包,复制在同可执行jar所在的目录或某个子目录下. 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包复制到/usrhome目录下或/usrhome/lib 等类似的子目录下.
    2、修改Manifest 文件
    在Manifest.mf文件里加入如下行
    Class-Path:classes12.jar lib/thirdlib.jar //多个jar包可以使用空格分开 。常用方式。
    3、ClassLoader方案
    设置自己ClassLoader进行加载jar类,否则只能通过以上两种方法设置classpath。高级方式,一般apache的java项目多是使用此方式定制自己的类加载路径。

    展开全文
  • 本文演示利用自定义的 ClassLoader 加密 Java Class 文件 首先,我们定义一个需要被加密的Java Class: classload.MyClassBase。 为了让客户端使用,需要定义一个 MyClassInterface, 这样客户端就不会直接引用 ...
  • 执行 java class 文件引入jar包

    千次阅读 2016-05-19 13:49:12
    执行 java class 文件引入jar包 执行某个java编译后的class文件,一般是一个入口文件的时候,经常需要引入某lib包下的jar文件,方法如下: java -classpath jar目录 class文件目录,eg:java -classpath .:lib/* Run ...
  • Intelidea创建好项目之后,右键新建Java class的时候发现没有改选项,只有以下几个选项 把sec目录设为源码目录,首先打开Project Structure
  • IntelliJ IDEA: 无法创建Java Class文件

    千次阅读 2019-07-05 14:57:15
    IntelliJ IDEA: 无法创建Java Class文件 2018年06月21日 22:49:44dandelion9508阅读数 11864 今天打开项目时,发现右击新建不了java.class文件,于是尝试了以下方法: (1)选择 File——>Project Structure...
  • IDEA中不能创建java class文件

    千次阅读 2019-04-22 17:03:47
    new选项中没有java class选项 二 解决方法 2.1 因为Maven配置的问题 将这个选项改为Use plugin registry 如果这个不成功请参考第二种方法: 2.2 第二种方法 在Java目录右键->Mark Directory as-> Sources ...
  • javap 反编译Java class字节码

    万次阅读 2016-08-04 13:32:41
    javap是Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码。用于分解class文件。  javap.exe位于C:\Program Files\Java\jdk1.8.0_91\bin。由于在环境变量 -> Path 中设置了%JAVA_HOME%\bin的...
  • The java class could not be loaded. java.lang.UnsupportedClassVersionError 昨天将一个Jar包替换运行,系统报如下错误: The java class could not be loaded. java.lang.UnsupportedClassVersionError: ...
  • IntelliJ IDEA无法在package下新建java class

    千次阅读 多人点赞 2018-05-22 22:23:05
    最近课比较多,很长时间没写博客。写博客有很多好处,但需要长久坚持,所以我又抽出时间来写篇博客。 言归正传,这段时间我在学习... 竟然没有新建Java Class的选项?我查了好久,最后发现是自己package文件夹的...
  • 现象:在Maven工程java目录中右键New没有Java class和package选项,如下 解决方法一:工程src/main/java目录右键-》“Mark Directory as”-》“Sources Root” 修改后的右键New发现有Java Class和package了 解决...
  • 在今天工作时,发现有个文件夹下无法新建java class文件,大多数情况下,可能是由于没有将文件夹设置为源文件夹,比如下图红框部分 我们可以采取如下图的操作,之后就可以创建想要的文件了 但是我今天碰到了另外一...
  • idea创建完maven项目后,点击右键没有Java Class选项解决如下:
  • 右键文件夹 不能新建Java Class和Package解决方法一:解决方法二:结果:
  • 查看java class文件版本的方法

    千次阅读 2014-07-26 13:16:14
    查看java class文件版本的方法 http://wangsong76.iteye.com/blog/264071
  • java Class cast方法

    万次阅读 2018-11-30 15:15:09
    今天在研究代码时候,发现一个Class类的方法cast() 看了一下源码。写出来分享一下。 先定义一个接口 Tree //抽象出 一个父类 即使 没有这个也没事 可以返回object 这个万类之父 public interface Tree { //输出...
  • Calling a Java Class from PowerBuilder 10

    千次阅读 2009-09-07 11:38:00
    Calling a Java Class from PowerBuilder 10Introduction This whitepaper discusses how to call a stand-alone Java class from within a PowerBuilder application, including how to deal with except
  • IDEA——Maven Web工程:无法创建Java Class文件

    万次阅读 多人点赞 2018-01-16 23:30:17
    然而,遇到了一个问题:无法创建Java class文件,即新建文件时,界面是这样的: 方法:手动创建Java源目录 选择 File——>Project Structure——>Project Settings——>Modules: 右键main目录,选择New ...
  • 查看Java class文件的字节码

    千次阅读 2011-04-05 12:11:00
    使用Java自带的工具javap可以查看Java class文件的机器码。 例:javap -c className   public Activity(); 0 aload_0 1 invokespecial 4 new 7 dup 8 ldc   aload_0 就是一...
  • Unable to parse template "Class" Error message: This template did not produce a Java class or an interface 上面这个报错的意思是IDEA 里面没有Java类的模板,不能自动生产Java类,需要创建一个模板。 问题...
  • 首先用一些二进制查看器打开class文件,比如od或者hexdump工具。 od -x hello.class ...这里我们看到前四个字节是Java class的特殊符号,叫做magic字段,用来告诉JVM这是个class文件,之后的两个字节是minor版本号
  • Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn’t supported yet: file [E:\develop_

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,507,459
精华内容 2,602,983
关键字:

javaclass

java 订阅