1.谈谈你对java的理解?
1.1平台无关性
编译时,运行时
Java源码首先被编译成字节码xx.class文件,再由不同平台的jvm进行解析,不需要再重新编译,java虚拟机会把字节码转换成具体平台上的机器指令.
jvm如何加载.class文件 ?
Class Loader: 加载class文件到内存
Execution Engine: 对命令进行解析
Native Interface: 不通开发语言原生库
Runtime Data Area: jvm内存空间结构模型
谈谈java反射?
java程序运行时,可以动态获取类或者对象的任意方法属性,允许改变程序结构或变量类型,这种动态获取和调用的功能,称为java反射机制
java反射示例
package s.simple.reflect; /** * @Title: Robot */ public class Robot { private String name; private void sayHelloPrivate(String tag) { System.out.println("hello " + tag); } public void hello() { System.out.println(name + " hello"); } }
package s.simple; import s.simple.reflect.Robot; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Hello world! */ public class App { public static void main(String[] args) { try { // 加载类 Class cls = Class.forName("s.simple.reflect.Robot"); // 实例化 Robot robot = (Robot) cls.newInstance(); // 获取方法(获取当前类的所有方法和属性,不能获取父类方法和接口方法) Method sayHelloPrivate = cls.getDeclaredMethod("sayHelloPrivate", String.class); // 获取private方法开启 sayHelloPrivate.setAccessible(true); sayHelloPrivate.invoke(robot, "666"); // 获取方法 Field name = cls.getDeclaredField("name"); // 设置private属性可读取 name.setAccessible(true); // 给属性赋值,属性没有get set方法 name.set(robot, "999"); // 获取public方法可以获取父类方法 Method hello = cls.getMethod("hello"); // 执行,没有参数不传 hello.invoke(robot); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }
1.2.GC
1.3.语言特性
1.4.面向对象
1.5.类库
1.6.异常处理
原文:https://www.cnblogs.com/412013cl/p/11089750.html