Class -- 10 -- Method类常用方法解析

原文链接:Class – 10 – Method类常用方法解析


相关文章:


这次主要整理下 Java 中 Method 类的常用方法


一、Method 类的定义

  • Method 类位于 java.lang.reflect 包中,主要用于在程序运行状态中,动态地获取方法信息

二、Method 类常用方法

  • getAnnotatedReturnType()

    • 返回一个 AnnotatedType 对象,该对象表示使用类型来指定由该可执行文件表示的方法或构造函数的返回类型

      public class MethodTest {
          
          public String test() {
              return null;
          }
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              AnnotatedType annotatedReturnType = method.getAnnotatedReturnType();
              // class java.lang.String
              System.out.println(annotatedReturnType.getType());
          }
      }
      

  • getAnnotatedExceptionTypes()

    • 返回一个 AnnotatedType 对象数组,这些对象表示使用类型来指定由该可执行文件表示的方法或构造函数声明的异常

      public class MethodTest {
          
          public void test() throws NullPointerException, ClassNotFoundException {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              AnnotatedType[] annotatedExceptionTypes = method.getAnnotatedExceptionTypes();
              for (AnnotatedType annotatedExceptionType : annotatedExceptionTypes) {
                  // class java.lang.NullPointerException
                  // class java.lang.ClassNotFoundException
                  System.out.println(annotatedExceptionType.getType());
              }
          }
      }
      

  • getAnnotatedReceiverType()

    • 返回一个 AnnotatedType 对象,该对象表示使用类型来指定该可执行对象表示的方法或构造函数的接收者类型

      public class MethodTest {
          
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              AnnotatedType annotatedReceiverType = method.getAnnotatedReceiverType();
              // class lang.reflect.MethodTest
              System.out.println(annotatedReceiverType.getType());
          }
      }
      

  • getAnnotation(Class<T> annotationClass)

    • 如果该方法对象存在指定类型的注解,则返回该注解,否则返回 null

    • 只有类级别的注解会被继承得到,对于其他对象而言,getAnnotation() 方法与 getDeclaredAnnotation() 方法作用相同

      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface MethodAnnotation {
      
          String key();
      
          String value();
      }
      
      public class MethodTest {
          
          @MethodAnnotation(key = "key", value = "value")
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              MethodAnnotation annotation = method.getAnnotation(MethodAnnotation.class);
              // @lang.reflect.MethodAnnotation(value=value, key=key)
              System.out.println(annotation);
          }
      }
      

  • getDeclaredAnnotation(Class<T> annotationClass)

    • 如果该方法对象存在指定类型的注解,则返回该注解,否则返回 null

    • 只有类级别的注解会被继承得到,对于其他对象而言,getAnnotation() 方法与 getDeclaredAnnotation() 方法作用相同


  • getAnnotationsByType(Class<T> annotationClass)

    • 如果该方法对象存在指定类型的注解,则返回该注解数组,否则返回 null

    • 只有类级别的注解会被继承得到,对于其他对象而言,getAnnotationsByType() 方法与 getDeclaredAnnotationsByType() 方法作用相同

    • getAnnotationsByType() 方法与 getAnnotation() 方法的区别在于:getAnnotationsByType() 方法会检查修饰该方法对象的注解是否为可重复类型注解,如果是则会返回修饰该方法对象的一个或多个注解

    • @Repeatable 用于声明注解为可重复类型注解

    • 当声明为可重复类型注解后,如果方法注解仍为一个,则 getAnnotation() 方法会正常返回,如果方法注解为多个,则 getAnnotation() 方法会返回 null

      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      @Repeatable(RepeatableAnnotation.class)
      public @interface MethodAnnotation {
      
          String key();
      
          String value();
      }
      
      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      @interface RepeatableAnnotation {
          MethodAnnotation[] value();
      }
      
      public class MethodTest {
          
          @MethodAnnotation(key = "key1", value = "value1")
          @MethodAnnotation(key = "key2", value = "value2")
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              // null
              System.out.println(method.getAnnotation(MethodAnnotation.class));
              MethodAnnotation[] annotationsByType = method.getAnnotationsByType(MethodAnnotation.class);
              // [@lang.reflect.MethodAnnotation(value=value1, key=key1), @lang.reflect.MethodAnnotation(value=value2, key=key2)]
              System.out.println(Arrays.toString(annotationsByType));
          }
      }
      

  • getDeclaredAnnotationsByType(Class<T> annotationClass)

    • 如果该方法对象存在指定类型的注解,则返回该注解数组,否则返回 null

    • 只有类级别的注解会被继承得到,对于其他对象而言,getAnnotationsByType() 方法与 getDeclaredAnnotationsByType() 方法作用相同


  • getAnnotations()

    • 返回该方法对象上的所有注解,如果没有注解,则返回空数组

    • 只有类级别的注解会被继承得到,对于其他对象而言,getAnnotations() 方法与 getDeclaredAnnotations() 方法作用相同

      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface MethodAnnotation {
      
          String key();
      
          String value();
      }
      
      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface TestAnnotation {
      
          String key();
      
          String value();
      }
      
      public class MethodTest {
          
          @MethodAnnotation(key = "key1", value = "value1")
          @TestAnnotation(key = "key2", value = "value2")
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              Annotation[] annotations = method.getAnnotations();
              for (Annotation annotation : annotations) {
                  // @lang.reflect.MethodAnnotation(value=value1, key=key1)
                  // @lang.reflect.Parameter.TestAnnotation(key=key2, value=value2)
                  System.out.println(annotation);
              }
          }
      }
      

  • getDeclaredAnnotations()

    • 返回该方法对象上的所有注解,如果没有注解,则返回空数组

    • 只有类级别的注解会被继承得到,对于其他对象而言,getAnnotations() 方法与 getDeclaredAnnotations() 方法作用相同


  • getModifiers()

    • 返回修饰该方法对象修饰符的整数形式,使用 Modifier 类对其进行解码

      public class MethodTest {
          
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              // public
              System.out.println(Modifier.toString(method.getModifiers()));
          }
      }
      

  • getName()

    • 返回方法对象名称

      public class MethodTest {
          
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              // test
              System.out.println(method.getName());
          }
      }
      

  • isAnnotationPresent(Class<? extends Annotation> annotationClass)

    • 如果该方法对象上有指定类型的注解,则返回 true,否则为 false

      public class MethodTest {
      
          @MethodAnnotation(key = "key", value = "value")
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              // true
              System.out.println(method.isAnnotationPresent(MethodAnnotation.class));
          }
      }
      

  • isVarArgs()

    • 如果该方法对象的参数中存在 可变参,则返回 true,否则为 false

      public class MethodTest {
      
          public void test(String ... args) {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test", String[].class);
              // true
              System.out.println(method.isVarArgs());
          }
      }
      

  • getDeclaringClass()

    • 返回该方法对象表示的方法所在类的 Class 对象

      public class MethodTest {
      
          public void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              Class<?> declaringClass = method.getDeclaringClass();
              // class lang.reflect.MethodTest
              System.out.println(declaringClass);
          }
      }
      

  • getAnnotatedParameterTypes()

    • 返回一个 AnnotatedType 对象数组,这些对象表示使用类型来指定由该可执行文件表示的方法或构造函数的形式参数类型

      public class MethodTest {
      
          public void test(String name, Integer age) {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test", String.class, Integer.class);
              AnnotatedType[] annotatedParameterTypes = method.getAnnotatedParameterTypes();
              for (AnnotatedType annotatedParameterType : annotatedParameterTypes) {
                  // class java.lang.String
                  // class java.lang.Integer
                  System.out.println(annotatedParameterType.getType());
              }
          }
      }
      

  • getParameterAnnotations()

    • 返回一组注解数组,这些注解以声明顺序修饰该方法对象的参数

      public class MethodTest {
      
          public void test(@ParameterAnnotation(key = "key1", value = "value1") String name,
                           @ParameterAnnotation(key = "key2", value = "value2") Integer age) {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test", String.class, Integer.class);
              Annotation[][] parameterAnnotations = method.getParameterAnnotations();
              // [[@lang.reflect.ParameterAnnotation(key=key1, value=value1)], [@lang.reflect.ParameterAnnotation(key=key2, value=value2)]]
              System.out.println(Arrays.deepToString(parameterAnnotations));
          }
      }
      

  • getParameterCount()

    • 返回该方法对象的参数个数 (无论是显式声明的还是隐式声明的或不声明的)

      public class MethodTest {
      
          public void test(String name, Integer age) {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test", String.class, Integer.class);
              // 2
              System.out.println(method.getParameterCount());
          }
      }
      

  • getParameters()

    • 返回一个参数对象数组,该数组表示该方法对象的所有参数

      public class MethodTest {
      
          public void test(String name, Integer age) {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test", String.class, Integer.class);
              Parameter[] parameters = method.getParameters();
              for (Parameter parameter : parameters) {
                  // java.lang.String name
                  // java.lang.Integer age
                  System.out.println(parameter);
              }
          }
      }
      

  • getDefaultValue()

    • 返会该注解方法对象表示的成员默认值

    • 如果成员属于基本数据类型,则返回对应的包装类实例

    • 如果没有默认值或者该方法实例不表示注解方法,则返回 null

      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface MethodAnnotation {
      
          String key() default "default key";
      
          String value() default "default value";
      }
      
      public class MethodTest {
      
          public static void main(String[] args) throws Exception {
              Method key = MethodAnnotation.class.getMethod("key");
              Method value = MethodAnnotation.class.getMethod("value");
              Object defaultValue1 = key.getDefaultValue();
              Object defaultValue2 = value.getDefaultValue();
              // default key
              System.out.println(defaultValue1);
              // default value
              System.out.println(defaultValue2);
          }
      }
      

  • getParameterTypes()

    • 返回一个 Class 对象数组,该数组以声明顺序表示该方法对象的参数对象 (擦除泛型)

      public class MethodTest<T> {
      
          public void test(T t, LinkedList<Integer> list) {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test", Object.class, LinkedList.class);
              Class<?>[] parameterTypes = method.getParameterTypes();
              // [class java.lang.Object, class java.util.LinkedList]
              System.out.println(Arrays.toString(parameterTypes));
          }
      }
      

  • getReturnType()

    • 返回一个 Class 对象,该 Class 对象表示该方法对象的返回对象 (擦除泛型)

      public class MethodTest<T> {
      
          public T test(T t) {
              return t;
          }
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test", Object.class);
              Class<?> returnType = method.getReturnType();
              // class java.lang.Object
              System.out.println(returnType);
          }
      }
      

  • getGenericReturnType()

    • 返回一个 Type 对象,该 Type 对象表示该方法对象的返回类型 (保留泛型)

      public class MethodTest<T> {
      
          public T test(T t) {
              return t;
          }
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test", Object.class);
              Type genericReturnType = method.getGenericReturnType();
              // T
              System.out.println(genericReturnType);
          }
      }
      

  • getExceptionTypes()

    • 返回一个 Class 对象数组,该数组表示由该方法对象抛出的异常对象 (擦除泛型)

      public class MethodTest<T> {
      
          public <T extends Exception> void test() throws T, NullPointerException {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test");
              Class<?>[] exceptionTypes = method.getExceptionTypes();
              // [class java.lang.Exception, class java.lang.NullPointerException]
              System.out.println(Arrays.toString(exceptionTypes));
          }
      }
      

  • getGenericExceptionTypes()

    • 返回一个 Type 对象数组,该数组表示由该方法对象抛出的异常类型 (保留泛型)

      public class MethodTest<T> {
      
          public <T extends Exception> void test() throws T, NullPointerException {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test");
              Type[] genericExceptionTypes = method.getGenericExceptionTypes();
              // [T, class java.lang.NullPointerException]
              System.out.println(Arrays.toString(genericExceptionTypes));
          }
      }
      

  • getTypeParameters()

    • 返回一个 TypeVariable 对象数组,该数组表示该方法对象声明列表上的类型变量数组

      public class MethodTest<T, V> {
      
          public <T, V> void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test");
              TypeVariable<Method>[] typeParameters = method.getTypeParameters();
              // [T, V]
              System.out.println(Arrays.toString(typeParameters));
          }
      }
      

  • toString()

    • 返回该方法对象的字符串表示形式 (擦除泛型)

      public class MethodTest<T, V> {
      
          public <T, V> void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test");
              // public void lang.reflect.MethodTest.test()
              System.out.println(method.toString());
          }
      }
      

  • toGenericString()

    • 返回该方法对象的字符串表示形式 (保留泛型)

      public class MethodTest<T, V> {
      
          public <T, V> void test() {}
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test");
              // public <T,V> void lang.reflect.MethodTest.test()
              System.out.println(method.toGenericString());
          }
      }
      

  • isAccessible()

    • 获取该方法对象的可访问标志

      public class MethodTest {
      
          private void test() {}
      }
      
      public class Test {
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              // false
              System.out.println(method.isAccessible());
          }
      }
      

  • setAccessible(boolean flag)

    • 设置该方法对象的可访问标志

    • 在其他类里调用该方法对象时,如果该方法为私有方法,需要设置访问标志为 true,否则会报异常

      public class MethodTest {
      
          private void test() {}
      }
      
      public class Test {
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getDeclaredMethod("test");
              method.setAccessible(true);
              // test
              System.out.println(method.getName());
          }
      }
      

  • isDefault()

    • 判断该方法对象是否为默认方法,如果是则返回 true,否则为 false

      public interface Interface {
      
          default void test() {
              System.out.println("这是一个默认方法");
          }
      }
      
      public class MethodTest implements Interface {
      
          public static void main(String[] args) throws Exception {
              Method method = MethodTest.class.getMethod("test");
              // true
              System.out.println(method.isDefault());
          }
      }
      

  • isSynthetic()

    • 判断该方法对象是否为合成方法,如果是则返回 true,否则为 false

    • 在内部类 InnerClass 中,name 是一个私有属性,而我们在外部类 MethodTest 中,直接引用了这个属性,因此编译器会生成一个合成方法,用于绕开 private 私有属性的限制

      public class MethodTest {
      
          private class InnerClass {
              private String name = "小明";
          }
      
          public static void main(final String[] arguments) {
              InnerClass innerClass = new MethodTest().new InnerClass();
              // name: 小明
              System.out.println("name: " + innerClass.name);
      
              Method[] declaredMethods = innerClass.getClass().getDeclaredMethods();
              for (Method declaredMethod : declaredMethods) {
                  // 【static java.lang.String lang.reflect.MethodTest$InnerClass.access$100(lang.reflect.MethodTest$InnerClass)】 isSynthetic(): true
                  System.out.println("【" + declaredMethod + "】" + " isSynthetic(): " + declaredMethod.isSynthetic());
              }
          }
      }
      
    • 有关 synthetic 的相关内容,小伙伴可以看下这里


  • isBridge()

    • 判断该方法对象是否桥接方法,如果是则返回 true,否则为 false

    • 桥接方法: 是 JDK1.5 引入泛型后,为了使 Java 的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法

      public interface Interface<T> {
      
          T test(T t);
      }
      
      public class MethodTest implements Interface<String> {
      
          @Override
          public String test(String str) {
              return str;
          }
      
          public static void main(final String[] arguments) {
              Method[] declaredMethods = MethodTest.class.getDeclaredMethods();
              for (Method declaredMethod : declaredMethods) {
                  //【public static void lang.reflect.MethodTest.main(java.lang.String[])】 isBridge(): false
                  //【public java.lang.String lang.reflect.MethodTest.test(java.lang.String)】 isBridge(): false
                  //【public java.lang.Object lang.reflect.MethodTest.test(java.lang.Object)】 isBridge(): true
                  System.out.println("【" + declaredMethod + "】" + " isBridge(): " + declaredMethod.isBridge());
              }
          }
      }
      
    • 有关 bridge 的相关内容,小伙伴可以看下这里

  • 14
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java EE常用框架 WebService 介绍 基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用 术语 XML. Extensible Markup Language -扩展性标记语言 WSDL – WebService Description Language – Web服务描述语言。 SOAP-Simple Object Access Protocol(简单对象访问协议) SOA(Service-Oriented Architecture) :面向服务的架构 它是一种思想,IBM大力倡导是即插即用的,IBM大力提倡,希望以组装电脑的方式来开发应用 它是目录服务,通过该服务可以注册和发布webservcie,以便第三方的调用者统一调用 使用: 二、我们可以使用Java自带的WsImport来实现本地代理。这种方法会将WebService翻译成Java,我们使用一样去访问WebService就行了。非常好用。 三、除了调用别人发布的webService,也可以自己发布WebService服务 四、CXF框架可以与spring无缝连接,就不用我们自己Endpoint了。它还能记录日志之的 五、我们还可以使用Idea下的webservice,能够使用图形画面的方式获取本地代理和生成WSDL文件。 Activiti 介绍 Activiti5是一个业务流程管理(BPM)框架 如果我们的业务是比较复杂的话,我们才会用到工作流! 使用Activiti的步骤 定义工作流 画一个BPMN图就可以了 部署工作流 执行工作流-->按照我们定义的工作流来执行 工作流在执行的过程中肯定会涉及到很多数据,Activiti是默认提供数据库表给我们使用的 Activiti工作流框架快速入门: 定义工作流,使用插件来把我们的流程图画出来。这个流程图就是我们定义的工作流。 工作流引擎是工作流的核心,能够让我们定义出来的工作流部署起来。 由于我们使用工作流的时候是有很多数据产生的,因此Activiti是将数据保存到数据库表中的。这些数据库表由Actitviti创建,由Activiti维护。 部署完的工作流是需要手动去执行该工作流的。 根据由谁处理当前任务,我们就可以查询出具体的任务信息。 根据任务的id,我们就可以执行任务了。 细节 流程定义:涉及到了四张数据库表 我们可以通过API把我们的流程定义图读取出来 可以根据查询最新版本的流程定义 删除流程定义 部署流程定义的时候也可以是ZIP文件 流程运行:涉及到两个对象,四张数据库表: 流程实例 获取流程实例和任务的历史信息 判断流程实例是否为空来判断流程是否结束了 查看正在运行服务的详细信息 通过流程实例来开启流程 流程变量:它涉及到了两张表。 流 程变量实际上就是我们的条件。 作用 我们可以在流程开始的时候设置流程变量,在任务完成的时候设置流程变量。 运行时服务和流程任务都可以设置流程变量。 连线 通过连线我们可以在其中设置条件,根据不同的条件流程走不同的分支 排他网关 SpringData JPA 简介 API Repository接口 PagingAndSortingRepository JpaRepository JpaSpecificationExecutor 过滤条件查询接口 注解 nameQuery注解 SQL命名,调用的时候根据名称调用 查询注解 1,targetEntity 属性表示默认关联的实体型,默认为当前标注的实体。 2,cascade属性表示与此实体一对一关联的实体的级联样式型。 3,fetch属性是该实体的加载方式,默认为即时加载EAGER 4,optional属性表示关联的该实体是否能够存在null值,默认为ture,如果设置为false,则该实体不能为null, 5, mapperBy属性:指关系被维护端 1,@JoinColumn注释是保存表与表之间关系的字段 2,如果不设置name,默认name = 关联表的名称+”-“+关联表
第4章 Java的方法 4-1 模组化程式设计 4-2 程序是一个黑盒子 4-3 Java的方法 4-4 Java的别变数和变数范围 4-5 方法的过载 4-6 递回程式设计 4-7 Math数学别的方法 4-1 模组化程式设计-模组 模组化是一种解决问题的方法,把一件大型的工作切割成无数的小工作,切割的工作属於结构化分析的范畴,我们最常使用的是「由上而下的设计方法」(Top-down Design),主要是以程序为单位来切割工作,也就是所谓的「程序式程式设计」(Procedural Design). 4-1 模组化程式设计-由上而下的设计方法 由上而下的设计方法是在面对问题时,先考虑将整个解决问题的方法分解成数个大「模组」(Modules),然后针对每一个大模组,一一分割成数个小模组,如此一直细分,最后等这些细分小问题的小模组完成后,再将它们组合起来,如此一层层的向上爬,完成整个软体系统或应用程式的设计. 例如:玩拼图游戏一定会先将整个拼图粗分为数个区域,等每一个区域都拼好后,整张拼图也就完成了. 4-1 模组化程式设计-注意事项 独立性:每一个分割模组间的关联性愈少,处理起来就会愈快.所谓独立性,是指当处理某一个子问题时,无需考虑到其它子问题.换一句话说,独立性是要将每一个问题都定义成一件简单且明确的问题. 结合问题:小心的控制子问题间的结合方法,而且要注意结合这些子问题的逻辑顺序,避免语焉不详的结果. 子问题间的沟通:虽然独立性可以减少各问题间的关联性,但是并无法避免掉全部的沟通. 4-2 程序是一个黑盒子-说明 在程式码执行程序称为呼叫(Subroutines Call) . 程序如同一个「黑盒子」(Black Box),只要告诉我们如何使用这个黑盒子的「使用介面」(Interface)即可,如下图所示: 4-2 程序是一个黑盒子-规则 在使用程式语言撰写程序时,有一些规则可供参考,如下所示: 程序的使用介面需要直接,良好定义和容易了解. 在使用程序时,我们不需要知道任何有关内部实作的问题,唯一需要知道的是如何使用它的使用介面. 在实作程序时,我们并不用考量或知道到底是谁需要使用此程序,只需满足使用介面定义的输入参数和传回值即可. 4-2 程序是一个黑盒子-语法与语意 程序的「语法」(Syntactic)是说明程序需要传入何种资料型态的「参数」(Parameters)和传回值. 「语意」(Semantic)是指出这个程序可以作什麼事 在撰写程序时,我们需要了解程序的语法规则,在使用程序时需要了解程序的语意规则,以正确的呼叫程式. 4-3 Java的方法 4-3-1 建立Java的方法 4-3-2 方法的参数传递 4-3-3 方法的传回值 4-3-4 传值或传址参数 4-3 Java的方法 在Java的程序属於一种别的成员,称为「方法」(Method),在Java的程序或函数称为方法. Java的方法可以分为两种,如下所示: 属於别的「方法」(Class Methods) 物件的「实例方法」(Instance Methods) Java的方法就是其它程式语言所谓的程序和函数. 4-3-1 建立Java的方法-语法 Java语言的方法是由方法名称和程式区块所组成,其语法格式如下所示: 存取叙述 static 传回值型态 方法名称( 参数列 ) { …… 程式叙述; …… } 4-3-1 建立Java的方法-存取叙述修饰子 「存取叙述」(Access Specifier)也一种修饰子,可以是public和private,如下所示: public:这个方法可以在程式任何地方进行呼叫,甚至是其它Class. private:这个方法只能在同一个Class内进行呼叫. 4-3-1 建立Java的方法-范例 例如:显示讯息字串的printMsg()方法,如下所示: private static void printMsg() { System.out.println("欢迎使用Java程式设计!"); } 上述方法的传回值为void,表示没有传回值,方法名称为printMsg,在括号内定义传入的参数列,不过此方法并没有任何参数,在「{」和「}」括号内是方法的程式区块. 4-3-1 建立Java的方法-呼叫 (语法) Java方法的呼叫需要使用别名称或方法名称,其语法格式如下所示: 方法名称( 参数列 ); 别名称.方法名称( 参数列 ); 4-3-1 建立Java的方法-呼叫 (范例) 因为printMsg()方法没有传回值和参数列,所以呼叫方法只需使用方法名称加上空括号,如下所示: printMsg(); 上述呼叫的方法因为在同一个别,所以省略别名称,如果是在其他别呼叫此方法,例如:public修饰子的add2Ten()方法,其呼叫方式如下所示: Ch4_3_1.add2Ten(); 上述程式码「.」运算子前的Ch4_3_1就是别名称. 4-3-2 方法的参数传递-说明 Java方法的参数列是资讯传递的机制,可以从外面将资讯送入程序的黑盒子,参数列是方法的使用介面. 一个方法如果拥有参数列,在呼叫方法时,传入不同的参数就可以产生不同的执行结果. 4-3-2 方法的参数传递-范例 例如:printTriangle()方法传入不同字元和层数,就可以显示不同大小和字元的文字三角形,如下所示: static void printTriangle(char ch, int level) { int i, j; for ( i = 1; i <= level; i++) { for ( j = 1; j 0,使用n!定义的第2条计算阶层函数4!的值,如下所示: 4!=4*3*2*1=24 因为阶层函数本身拥有递回特性.可以将4!的计算分解成子问题,如下所示: 4!=4*(4-1)!=4*3! 现在3!的计算成为一个新的子问题,必须先计算出3!值后,才能处理上述的乘法. 4-6-2 递回的阶层函数-过程2 同理将子问题3!继续分解,如下所示: 3! = 3*(3-1)! = 3*2! 2! = 2*(2-1)! = 2*1! 1! = 1*(1-1)! = 1*0! = 1*1 = 1 最后在知道1!的值后,接著就可以计算出2!~4!的值,如下所示: 2! = 2*(2-1)! = 2*1! = 2 3! = 3(3-1)! = 3*2! = 3*2 = 6 4! = 4*(4-1)! = 4*3! = 24 4-6-2 递回的阶层函数-方法 04: static int factorial(int n) 05: { // 终止条件 06: if ( n == 1 ) return 1; 07: else return n * factorial(n-1); 08: } 4-6-3 河内塔问题-说明 「河内塔」(Tower of Hanoi)问题是程式语言在说明递回观念时,不可错过的实例,这是一个流传在Brahma庙内的游戏,庙内的僧侣相信完成这个游戏是一件不可能的任务.河内塔问题共有三根木桩,如下图所示: 4-6-3 河内塔问题-规则 共有n个盘子放置在第一根木桩,盘子的尺寸由上而下依序递增.河内塔问题是将所有的盘子从木桩1搬移到木桩3,在搬动的过程中有三项规则,如下所示: 每次只能移动一个盘子,而且只能从最上面的盘子搬动. 任何盘子可以搬到任何一根木桩. 必须维持盘子的大小是由上而下依序递增. 4-6-2 河内塔问题-步骤 归纳出三个步骤,如下所示: Step 1:将最上面n-1个盘子从木桩1搬移到木桩2. Step 2:将最后一个盘子从木桩1搬移到木桩3. Step 3:将木桩2的n-1个盘子搬移到木桩3. 4-6-3 河内塔问题-方法 04: static void towerofHanoi(int dishs, int peg1, 05: int peg2, int peg3) 06: { if ( dishs == 1 ) { // 终止条件 07: System.out.print("盘子从" + peg1); 08: System.out.println("移到" + peg3); 09: } 10: else 11: { // 第一步骤 12: towerofHanoi(dishs-1, peg1, peg3, peg2); 13: System.out.print("盘子从" + peg1); 14: System.out.println("移到" + peg3); 15: // 第三步骤 16: towerofHanoi(dishs-1, peg2, peg1, peg3); 17: } 18: } 4-7 Math数学别的方法 4-7-1 计算乱数,最大和最小值 4-7-2 Math别的数学常数和方法 4-7 Math数学别的方法 Java API的Math数学别提供数学常数和各种数学函数的方法,我们可以在Java程式码使用乱数,计算最大值,最小值,三角和指数等数学函数,因为它是方法,在呼叫方法时需要指明别Math. 4-7-1 计算乱数,最大和最小值 Math别提供方法计算乱数,最大值和最小值.相关方法说明如下表所示: 4-7-2 Math别的数学常数和方法- 常数 Math别提供两个常用的数学常数,其说明如下表所示: 4-7-2 Math别的数学常数和方法- 方法1 Math别还提供三角函数(Trigonometic),指数(Exponential)和对数(Logarithmic)的方法.其相关方法说明如下表所示: 4-7-2 Math别的数学常数和方法- 方法2 上表三角函数的参数是径度,并不是角度,如果是角度,请使用toRadians()方法先转换成径度. End
一. Java基础部分 7 1、一个".java"源文件中是否可以包括多个(不是内部)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 9 6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 9 7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承接口? 抽象是否可实现(implements)接口? 抽象是否可继承具体(concrete class)? 抽象中是否可以有静态的main方法? 15 21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 18 26、什么是内部?Static Nested Class 和 Inner Class的不同。 19 27、内部可以引用它的包含的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部) 是否可以extends(继承)其它,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String是最基本的数据型吗? 22 31、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 24 38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 41、运行时异常与一般异常有何异同? 27 42、error和exception有什么区别? 28 43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 29 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 32 49. 下面两个方法同步吗?(自己发明) 33 50、多线程有几种实现方法?同步有几种实现方法? 33 51、启动一个线程是用run()还是start()? . 33 52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 59、ArrayList和Vector的区别 44 60、HashMap和Hashtable的区别 44 61、List 和 Map 区别? 45 62、List, Set, Map是否继承自Collection接口? 45 63、List、Map、Set三个接口,存取元素时,各有什么特点? 45 64、说出ArrayList,Vector, LinkedList的存储性能和特性 46 65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 48 70、TreeSet里面放对象,如果同时放入了父和子的实例对象,那比较时使用的是父的compareTo方法,还是使用的子的compareTo方法,还是抛异常! 48 71、说出一些常用,包,接口,请各举5个 49 72、java中有几种型的流?JDK为每种型的流提供了一些抽象以供继承,请说出他们分别是哪些? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的优点和原理。并考虑2种回收机制。 52 79、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 52 80、什么时候用assert。 53 81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 62 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。 65 4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。 65 5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归算法题2 78 10、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 79 11、有数组a[n],用java代码将数组元素顺序颠倒 80 12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、请写出用于校验HTML文本框中输入的内容全部为数字的javascript代码 84 5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet的基本架构 86 6、SERVLET API中forward() 与redirect()的区别? 86 7、什么情况下调用doGet()和doPost()? 86 8、Request对象的主要方法: 87 9、forward 和redirect的区别 87 10、request.getAttribute() 和 request.getParameter() 有何区别? 88 11. jsp有哪些内置对象?作用分别是什么? 分别有什么方法? 88 12. jsp有哪些动作?作用分别是什么? 88 13、JSP的常用指令 89 14. JSP中动态INCLUDE与静态INCLUDE的区别? 89 15、两种跳转方式分别是什么?有什么区别? 89 16、页面间对象传递的方法 89 17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 90 20.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset 91 五. 数据库部分 91 1、用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息。 91 2、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序 91 3、存储过程与触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面的经验? 95 6、union和union all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除除了id号不同,其他都相同的学生冗余信息 104 14.航空网的几个航班查询题: 104 15.查出比经理薪水还高的员工信息: 105 16、求出小于45岁的各个老师所带的大于12岁的学生人数 106 17.求出发帖最多的人: 107 18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。 108 20. xxx公司的sql面试 108 21、注册Jdbc驱动程序的三种方式 109 22、用JDBC如何调用存储过程 109 23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作机制是什么? 113 30、为什么要用 ORM?  和 JDBC 有何不一样? 113 六. XML部分 113 1、xml有哪些解析技术?区别是什么? 113 2、你在项目中用到了xml技术的哪些方面?如何实现的? 114 3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 120 6、Struts优缺点 优点: 1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现. 120 7、STRUTS的应用(如STRUTS架构) 121 8、说说struts1与struts2的区别。 121 9、hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。 122 10、简述 Hibernate 和 JDBC 的优缺点? 如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, 字符串型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. 软件工程与设计模式 126 1、UML方面 126 2、j2ee常用的设计模式?说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、J2EE是技术还是平台还是框架? 什么是J2EE 128 6、请对以下在J2EE中常用的名词进行解释(或简单描述) 129 7、如何给weblogic指定大小的内存? 129 8、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 129 9、如何启动时不需输入用户名与密码? 130 10、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 130 11、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办? 130 12、在weblogic中发布ejb需涉及到哪些配置文件 130 13、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置? 130 14、如何查看在weblogic中已经发布的EJB? 131 十. EBJ部分 131 1、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 131 2、简要讲一下 EJB 的 7 个 Transaction Level? 131 3、EJB与JAVA BEAN的区别? 131 4、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的? 132 5、EJB容器提供的服务 132 6、EJB的激活机制 132 7、EJB的几种型 132 8、客服端调用EJB对象的几个基本步骤 133 十一. webservice部分 133 1、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 133 2、CORBA是什么?用途是什么? 133 3. Linux 134 4、LINUX下线程,GDI的解释。 134 5. 问得稀里糊涂的题 134 6、四种会话跟踪技术 134 7、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 134 十二. 其他 134 1、请用英文简单介绍一下自己. 134 2、请把 http://tomcat.apache.org/ 首页的这一段话用中文翻译一下? 135 3、美资软件公司JAVA工程师电话面试题目 135

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值