char和byte遍历出来显示有问题
提前声明:我们在学习一样东西的时候,不懂就先死记硬背。不懂或者没有理解,是因为我们段位还不够。过一段时间反过来再看一遍可能就懂了。
foo类的类类型是指c1 c2 c3 ,和foo类有什么区别呢
1、创建类的实例:Foo foo=new Foo();
再想Java中,万物皆对象
那么Foo的实例对象是啥? 那就是老师所讲的 类类型 c1 c2..... Class c1 = foo.getClass();
2、用Foo直接创建实例对象和用c1 c2 c3 创建的实力对象有什么区别
说明Foo实例对象是:Foo foo=new Foo();
new 出来的对象是静态加载类,在编译时刻加载所有可能使用到的类。
c1 c2....是动态加载类的,这样我们编译不会报错,只有我们用到那个对象后,发现他不存在,才会报错,也就是老师所说的运行时加载类。
上诉是我对老师所讲的理解,希望对你有所帮助。
不合理的地方望指正,大家相互学习
本来代码里面是动态类实现,你Constructor constructor=c.getConstructor();这行代码使用了静态类的实现方式,应该会编译不过,因为c.getConstructor()无法在静态编译期间确定类型。
他这个例子中,类名就是类的全名了,不同于我们在idea或者eclipse中的建了很多个包,他demo中几个类都在磁盘的同一个位置,就不存在要通过类的全名转化成文件的路径,去找到对用的class。 args[0]这个代表的就是你传入的是哪个类就是哪个
你 Word 实现或继承了 OfficeAble 了嘛!!!!
也可以继承同一个父类啊 这里实现接口,继承父类都可以
用getDeclaredFields()获取成员变量的信息
我已经通过度娘知道答案了。可以获取
感觉没有错,你看错误提示是什么
刚看完所有讲反射的视频。我觉得能提出Class和Object的关系的问题的同学是善于思考的人(因为这个问题我一开始没想)。以下个人观点:Class和Object二者应该是不同维度和角度的,但二者也确实存在关联.Class是类类型,所有类的类类型的父类都是Class,Object本身也是一个类,所以它的类类型父类应该也是Class;Object是类,所有类的父类都是Object,Class虽然是类类型,但是类类型也是一个类,所以Object也是Class的父类.这样的描述听上去似乎有点绕,也有点哲学命题的意味,以为二者讨论的问题的角度和维度是不同的。
验证代码:
//Object的类类型的父类是Class
Class<?>cm=Object.class;
System.out.println(cm);
//Class的父类是Object
Class<?> cn="hello".getClass();
Object o=cn;
System.out.println(o);
和我一样,强迫症,不想看到最后有逗号。
for(int j=0;j<paramsType.length;j++){ System.out.print(paramsType[j].getSimpleName()); if(j<paramsType.length-1){ System.out.print(","); } }
假设是Hello类,先Class c = Hello.class获取类类型 Method[] mm = c.getMethods()或c.getDacledMethods();
getMethods 获取所有public方法 包含继承所得
getDacledMethods 获取本类自己声明的所有方法
在for循环中迭代方法数组
for(int i = 0; i < mm.length; i++){
Class[] paramType = mm[i].getParameterTypes(); //此处获取方法的参数列表 数据类型的类类型
//自行迭代参数类型的类类型数组paramType即可
}
连个问题都说不明白,还提问?
这个只是提醒不是错误,可以直接过。因为newInstance在jdk9之后就放弃不用了,所以会出现这个问题。
可以用所有类的共同父类Object来遍历
想要访问普通方法需要先创建对象,不可直接通过类名访问
你代码里面的第一种创建方法写错了,直接用类来创建的话,就是Foo.class就行了,后面不要带括号。 用对象创建的话foo1.getClass()才需要带括号
还是要所了解基础
个人感觉不是java中的类都是java.lang.Class的对象,而是每一个类都有一个隐藏的属性class,这个属性里封装了该类的所有信息,比如它的字段信息,方法信息等,我们可以通过类名.class或者对象名.getClass()或者Class的静态方法Class.forName()来获取到该隐藏的class属性,进而了解这个类的详细信息。
看错了,打扰了。
因为c3会抛出异常。一个变量的声明一般要写在Try的外面,即使发生的异常,catch 之后的代码也能正常引用c3。catch后面的代码有可能会是检查c3是否为空之类的。总之,声明变量一般要写在try, catch 外面.
args 是 使用 命令行的参数列表 形如: java 指定的程序名 参数
args[0]即 参数列表的 第一个参数
"Word".equals(args[0]) 即判断 第一个参数是否等于 word
反射可以绕过编译阶段
解决了,去获取class type的时候需要使用泛型
如:
Class<?> b = a.getClass();
试了下,不传参数编译不通过,可以传类对象,也可以传一个null
要用动态加载,你这是静态加载去变异了,寻找不到