黑马程序员技术交流社区

标题: 反射。 [打印本页]

作者: 王德升    时间: 2012-7-13 19:46
标题: 反射。
本帖最后由 王德升 于 2012-7-14 20:17 编辑

一:
package cn.itcast.day01;

public class StaticImport
{
        public static void main(String[] args)
        {
                int x = 1;
                try {
                        x++;
                } finally {
                        System.out.println("haha");
                        System.out.println("hahaha");
                }
                System.out.println("你好,我的Ecs"+x);
        }
        //为什么我在这里导入syso然后按ALT+/就倒不出来呢?
}



二:

package cn.itcast.day01;

public class ReflectTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String str = "abc";
               
                Class cla1 = String.class;
                Class cla2 = str.getClass();
                try
                {
                        Class cla3 = Class.forName("java.lang.String");//这句话为什么会有异常呢?
                }
                catch(Exception e)
                {
                        throw new RuntimeException("出错了");
                }
               
                System.out.println(cla1 == cla2);
                try
                {
                        System.out.println(cla1 == cla3);//这句话还会报异常
                }
                catch(Exception e)
                {
                        throw new RuntimeException("不对啦");
                }
        }

}
//我这样写为什么还会报错?
作者: 黑马振鹏    时间: 2012-7-13 20:12
本帖最后由 黑马振鹏 于 2012-7-13 20:16 编辑

package cn.itcast.day01;

public class StaticImport
{
        public static void main(String[] args)
        {
                int x = 1;
                try {
                        x++;
                } finally {
                        System.out.println("haha");
                        System.out.println("hahaha");
                }
                System.out.println("你好,我的Ecs"+x);
        }
        //为什么我在这里导入syso然后按ALT+/就倒不出来呢?
    这里在主函数的外面,如果写语句的时候,只能是写个函数().并不能直接写输出语句。
}

第二个异常主要是字符串可能输入错误导致的。

作者: 何旭栋    时间: 2012-7-13 20:21
package cn.itcast.day01;

public class ReflectTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String str = "abc";
               
                Class cla1 = String.class;
                Class cla2 = str.getClass();
                try
                {
                        Class cla3 = Class.forName("java.lang.String");//这句话为什么会有异常呢?
//通常classpath不正确或者jdk版本不对都可能出现异常啊
                }
                catch(Exception e)
                {
                        throw new RuntimeException("出错了");
                }
               
                System.out.println(cla1 == cla2);
                try
                {
                        System.out.println(cla1 == cla3);//这句话还会报异常
//cla3是局部变量,在这里是无法访问的
                }
                catch(Exception e)
                {
                        throw new RuntimeException("不对啦");
                }
        }

}
作者: 张天天    时间: 2012-7-13 20:40
方法怎么能写在类里面呢。。。
方法之间的调用都是通过方法的
就是说在方法中才能调用另一个方法
所以那样写是错的,当然不给提示

forName方法接收字符串参数时,该参数必须为完整的类路径,
包括包名一定要加上,否则找不到的

Class cla3;把这个写在try块的外面,
在里面定义在外面的使用不了的,呵呵
作者: 陆强强    时间: 2012-7-14 00:11
  try
                {
                        Class cla3 = Class.forName("java.lang.String");// Class.forName里面要全名的,如果类型不匹配就是ClassNotFoundException
              }
    try
                {
                        System.out.println(cla1 == cla3);//cla3是class.forName()得来的,所以要抓或者抛异常。如果一个方法有异常,那所有调用它的语句都要抓或抛异常,至于楼上说的变量在里面是编译时错误,不是异常
                 }
  
作者: 柯玲    时间: 2012-7-14 18:41
参考JDK上的描述:public static Class<?> forName(String className)  throws ClassNotFoundException 说明已定义在应用此方法时会出现ClassNotFoundException异常,所以我们在调用此方法时必须将异常抓住或抛出;
System.out.println(cla1 == cla3);此句编译都不会通过,原因是cla3不像cla1一样,处在全局变量的位置,所以无法引用到cla3,要想引用到cla3,cla3必须声明一个引用到try语句外面,那么此处抓异常就是不必要的动作了。
下面是我写的优化代码:
  1. public static void main(String[] args) {
  2.         String str = "abc";
  3.         Class cla1 = String.class;
  4.         Class cla2 = str.getClass();
  5.         Class cla3 = null;
  6.                 try {
  7.                         cla3 = Class.forName("java.lang.String");
  8.                 } catch (ClassNotFoundException e1) {
  9.                         e1.printStackTrace();
  10.                 }
  11.         System.out.println(cla1 == cla2);
  12.         System.out.println(cla1 == cla3);
  13.     }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2